Wednesday 16 August 2023

Sistem Manajemen Aset

 


FITUR-FITUR AMTS (Asset Management and Tracking System)

    •   ROLE MANAGEMENT

Setiap user memiliki akses fitur-fitur tertentu, dan memberikan hak approval seperti sudah diatur di role management ini  (misalakan untuk : opname, maintenance, upload master aset).

    •   LEVEL PELACAKAN

Filter pertanggung jawaban sebuah aset dapat ditentukan berdasarkan Holding Company, Perusahaan, branch, sub-branch, divisi, department, bahkan bisa untuk informasi Level informasi area, gedung, lantai, dan ruangan.

    •   REGISTRASI

Semua data aset yang masuk ke AMTS harus dipastikan terregistrasi dengan melakukan proses registrasi via mobile atau automatic register via proses upload data master aset.

    •   COST CENTER

Setiap aset di AMTS dapat ditentukan department “pemilik”nya, sehingga alokasi pertanggung jawaban jelas.

    •   LAMPIRAN ASET

Aset info dapat ditambahkan dengan lampiran file dokumen pdf, termasuk foto atau gambar aset yang dapat ditambahkan atau diperbarui saat asset opname dilakukan

    •   ASSET COMPONENT

Transaksi Aset Component digunakan untuk mendefinisikan aset-aset yang menjadi ‘child’/anak dari aset utama yang tidak dapat dipisahkan dari suatu aset utama.

    •   TEMPLATE DUPLIKASI ASET

Transaksi Template Duplikasi Aset dapat mempercepat proses registrasi aset dengan jenis dan info yang sama, sebagai contohnya: 25 unit PC dengan spesifikasi teknis yang sama dengan satu kali transaksi dan kemudian dapat menambahkan informasi tambahan lainnya.

    •   ASSET MOVEMENT & MUTASI ASET

Dengan adanya aplikasi transaksi movement di aplikasi mobile, maka perpindahan aset anda ke lokasi lain akan terus terlacak dan tidak akan kehilangan informasi keberadaannya.

    •   BORROW-RETURN

Transaksi Borrow-Return (Peminjaman Asset) akan mengingatkan peminjam aset dan yang menyetujui peminjaman tersebut dengan mengirimkan notifikasi via email  ketika tanggal sudah mendekati/melewati overdue.

    •   SERVICE MONITORING

Berbagai aset biasanya memerlukan perawatan berkala dan perpanjangan dokumen penting, contohnya penggantian accu pada mobil operasional, service kendaraan, service AC, perpanjangan STNK, Perpanjangan polis asuransi kendaraan. Dengan fitur Notifikasi/Reminder, user  yang sudah ditentukan akan mendapatkan email pengingat agar menjaga ketepatan waktu proses services yang harus di lakukan untuk asset tersebut.

    •   OPNAME REPORT

Untuk mempermudah stock opname dan identifikasi pertanggung jawaban aset di lokasi dapat dilakukakn dengan handheld aplikasi Android, atau akses web-version AMTS dengan browser apapun. Laporan dapat dieksport ke excel atau pdf sesuai dengan kebutuhan anda.

    •   INQUIRY

Dalam menu Inquiry, setiap user dapat memilih data report/inquiry data yang ingin ditampilkan berdasarkan sub-branch, lokasi, asset class, penanggungjawab, tanggal pembelian, dan lain-lain

    •   ASSET DISPOSAL

Jika suatu aset sudah tidak digunakan atau masa pemanfaatannya sudah habis atau tidak perlu dilacak lagi, maka dapat dieksekusi dengan transaksi Asset Disposal.


Referensi : 

https://acsgroup.co.id/id/2023/08/03/indonesia-amts-solusi-mempermudah-manajemen-peralatan-atau-asset-perusahaan/?utm_source=google&utm_medium=cpc&utm_campaign=NDI_acsgroup&gclid=CjwKCAjw5_GmBhBIEiwA5QSMxDeDEqEcvwFSbtcuhNCZf7HQwHg0FrBSUU8X4enuQ-RRM7UNmLIN3xoCfVUQAvD_BwE

https://www.hashmicro.com/id/smart-asset-solution?adwords&utm_term=aplikasi%20aset&utm_campaign=&utm_source=adwords&utm_medium=ppc&hsa_acc=8756823995&hsa_cam=20436033759&hsa_grp=149522314022&hsa_ad=669136549383&hsa_src=g&hsa_tgt=kwd-731357804327&hsa_kw=aplikasi%20aset&hsa_mt=b&hsa_net=adwords&hsa_ver=3&gclid=CjwKCAjw5_GmBhBIEiwA5QSMxCtCMoWEyTwfcm7Ke9EuZ-ssYKmnXViDnLuLr1nFJ9eGsq-OGAeoVhoCyH0QAvD_BwE

https://asetkita.id/?gclid=CjwKCAjw5_GmBhBIEiwA5QSMxPARLWEEYp9zmCoteLGh8w8Fblp44GaZ3J7rg_Hi55YgwPQlR-RPDhoCr-sQAvD_BwE

https://asetkita.id/features/

https://guide.asetkita.id/

https://guide.asetkita.id/knowledge-base/pembatalan-penghapusan-reverse-disposal-aset/#transaksi-reverse-disposal-buat-dokumen

Html form to google-sheet

 





Read Write Google Sheet ok 1

 















Google Sheet API

 




Menggunakan Sheetdb

 



Referensi





Data Entry Form Sheet

 







Ref :


https://script.google.com/home/projects/1nEW852N05GgKlN_kNLN9Vma_GsaPf44_loA4ZtYM3qi-k-LRrDPwQ14k/edit



Crud Web App

 


















https://www.bpwebs.com/crud-operations-on-google-sheets-with-online-forms/#more-6181

Tuesday 15 August 2023

UMKM Bea Cukai

 




Entry form google sheet

 




Drive digital skill public app

https://script.google.com/macros/s/AKfycbx2Sx2AX1BAl52HmDdaDe8QTHdkDD1BYjySACy5BkxRjyH3fv4aG6bWrjeF0u45KAU/exec

https://www.bpwebs.com/crud-operations-on-google-sheets-with-online-forms/

Edit Response Form Google Sheet


 




/**
 * @license MIT
 * 
 * © 2019-2020 xfanatical.com. All Rights Reserved.
 *
 * @since 1.1.2 interface fix
 * @since 1.1.1 Optimize performance (continued)
 * @since 1.1.0 Optimize performance
 * @since 1.0.0 Add all edit response urls and update new urls for new submissions
 */
function registerNewEditResponseURLTrigger() {
  // check if an existing trigger is set
  var existingTriggerId = PropertiesService.getUserProperties().getProperty('onFormSubmitTriggerID')
  if (existingTriggerId) {
    var foundExistingTrigger = false
    ScriptApp.getProjectTriggers().forEach(function (trigger) {
      if (trigger.getUniqueId() === existingTriggerId) {
        foundExistingTrigger = true
      }
    })
    if (foundExistingTrigger) {
      return
    }
  }

  var trigger = ScriptApp.newTrigger('onFormSubmitEvent')
    .forSpreadsheet(SpreadsheetApp.getActive())
    .onFormSubmit()
    .create()

  PropertiesService.getUserProperties().setProperty('onFormSubmitTriggerID', trigger.getUniqueId())
}

function getTimestampColumn(sheet) {
  for (var i = 1; i <= sheet.getLastColumn(); i += 1) {
    if (sheet.getRange(1, i).getValue() === 'Timestamp') {
      return i
    }
  }
  return 1
}

function getFormResponseEditUrlColumn(sheet) {
  var form = FormApp.openByUrl(sheet.getFormUrl())
  for (var i = 1; i <= sheet.getLastColumn(); i += 1) {
    if (sheet.getRange(1, i).getValue() === 'Form Response Edit URL') {
      return i
    }
  }
  // get the last column at which the url can be placed.
  return Math.max(sheet.getLastColumn() + 1, form.getItems().length + 2)
}

/**
 * params: { sheet, form, formResponse, row }
 */
function addEditResponseURLToSheet(params) {
  if (!params.col) {
    params.col = getFormResponseEditUrlColumn(params.sheet)
  }
  var formResponseEditUrlRange = params.sheet.getRange(params.row, params.col)
  formResponseEditUrlRange.setValue(params.formResponse.getEditResponseUrl())
}


function onOpen() {
  var menu = [{ name: 'Add Form Edit Response URLs', functionName: 'setupFormEditResponseURLs' }]
  SpreadsheetApp.getActive().addMenu('Forms', menu)
}

function setupFormEditResponseURLs() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var spreadsheet = SpreadsheetApp.getActive()
  var formURL = sheet.getFormUrl()
  if (!formURL) {
    SpreadsheetApp.getUi().alert('No Google Form associated with this sheet. Please connect it from your Form.')
    return
  }
  var form = FormApp.openByUrl(formURL)

  // setup the header if not existed
  var headerFormEditResponse = sheet.getRange(1, getFormResponseEditUrlColumn(sheet))
  var title = headerFormEditResponse.getValue()
  if (!title) {
    headerFormEditResponse.setValue('Form Response Edit URL')
  }

  var timestampColumn = getTimestampColumn(sheet)
  var editResponseUrlColumn = getFormResponseEditUrlColumn(sheet)
  
  var timestampRange = sheet.getRange(2, timestampColumn, sheet.getLastRow() - 1, 1)
  var editResponseUrlRange = sheet.getRange(2, editResponseUrlColumn, sheet.getLastRow() - 1, 1)
  if (editResponseUrlRange) {
    var editResponseUrlValues = editResponseUrlRange.getValues()
    var timestampValues = timestampRange.getValues()
    for (var i = 0; i < editResponseUrlValues.length; i += 1) {
      var editResponseUrlValue = editResponseUrlValues[i][0]
      var timestampValue = timestampValues[i][0]
      if (editResponseUrlValue === '') {
        var timestamp = new Date(timestampValue)
        if (timestamp) {
          var formResponse = form.getResponses(timestamp)[0]
          editResponseUrlValues[i][0] = formResponse.getEditResponseUrl()
          var row = i + 2
          if (row % 10 === 0) {
            spreadsheet.toast('processing rows ' + row + ' to ' + (row + 10))
            editResponseUrlRange.setValues(editResponseUrlValues)
            SpreadsheetApp.flush()
          }
        }
      }
    }
    
    editResponseUrlRange.setValues(editResponseUrlValues)
    SpreadsheetApp.flush()
  }

  registerNewEditResponseURLTrigger()
  SpreadsheetApp.getUi().alert('You are all set! Please check the Form Response Edit URL column in this sheet. Future responses will automatically sync the form response edit url.')
}

function onFormSubmitEvent(e) {
  var sheet = e.range.getSheet()
  var form = FormApp.openByUrl(sheet.getFormUrl())
  var formResponse = form.getResponses().pop()
  addEditResponseURLToSheet({
    sheet: sheet,
    form: form,
    formResponse: formResponse,
    row: e.range.getRow(),
  })
}
/**
 * @license MIT
 * 
 * © 2019-2020 xfanatical.com. All Rights Reserved.
 *
 * @since 1.1.2 interface fix
 * @since 1.1.1 Optimize performance (continued)
 * @since 1.1.0 Optimize performance
 * @since 1.0.0 Add all edit response urls and update new urls for new submissions
 */
function registerNewEditResponseURLTrigger() {
  // check if an existing trigger is set
  var existingTriggerId = PropertiesService.getUserProperties().getProperty('onFormSubmitTriggerID')
  if (existingTriggerId) {
    var foundExistingTrigger = false
    ScriptApp.getProjectTriggers().forEach(function (trigger) {
      if (trigger.getUniqueId() === existingTriggerId) {
        foundExistingTrigger = true
      }
    })
    if (foundExistingTrigger) {
      return
    }
  }

  var trigger = ScriptApp.newTrigger('onFormSubmitEvent')
    .forSpreadsheet(SpreadsheetApp.getActive())
    .onFormSubmit()
    .create()

  PropertiesService.getUserProperties().setProperty('onFormSubmitTriggerID', trigger.getUniqueId())
}

function getTimestampColumn(sheet) {
  for (var i = 1; i <= sheet.getLastColumn(); i += 1) {
    if (sheet.getRange(1, i).getValue() === 'Timestamp') {
      return i
    }
  }
  return 1
}

function getFormResponseEditUrlColumn(sheet) {
  var form = FormApp.openByUrl(sheet.getFormUrl())
  for (var i = 1; i <= sheet.getLastColumn(); i += 1) {
    if (sheet.getRange(1, i).getValue() === 'Form Response Edit URL') {
      return i
    }
  }
  // get the last column at which the url can be placed.
  return Math.max(sheet.getLastColumn() + 1, form.getItems().length + 2)
}

/**
 * params: { sheet, form, formResponse, row }
 */
function addEditResponseURLToSheet(params) {
  if (!params.col) {
    params.col = getFormResponseEditUrlColumn(params.sheet)
  }
  var formResponseEditUrlRange = params.sheet.getRange(params.row, params.col)
  formResponseEditUrlRange.setValue(params.formResponse.getEditResponseUrl())
}


function onOpen() {
  var menu = [{ name: 'Add Form Edit Response URLs', functionName: 'setupFormEditResponseURLs' }]
  SpreadsheetApp.getActive().addMenu('Forms', menu)
}

function setupFormEditResponseURLs() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var spreadsheet = SpreadsheetApp.getActive()
  var formURL = sheet.getFormUrl()
  if (!formURL) {
    SpreadsheetApp.getUi().alert('No Google Form associated with this sheet. Please connect it from your Form.')
    return
  }
  var form = FormApp.openByUrl(formURL)

  // setup the header if not existed
  var headerFormEditResponse = sheet.getRange(1, getFormResponseEditUrlColumn(sheet))
  var title = headerFormEditResponse.getValue()
  if (!title) {
    headerFormEditResponse.setValue('Form Response Edit URL')
  }

  var timestampColumn = getTimestampColumn(sheet)
  var editResponseUrlColumn = getFormResponseEditUrlColumn(sheet)
  
  var timestampRange = sheet.getRange(2, timestampColumn, sheet.getLastRow() - 1, 1)
  var editResponseUrlRange = sheet.getRange(2, editResponseUrlColumn, sheet.getLastRow() - 1, 1)
  if (editResponseUrlRange) {
    var editResponseUrlValues = editResponseUrlRange.getValues()
    var timestampValues = timestampRange.getValues()
    for (var i = 0; i < editResponseUrlValues.length; i += 1) {
      var editResponseUrlValue = editResponseUrlValues[i][0]
      var timestampValue = timestampValues[i][0]
      if (editResponseUrlValue === '') {
        var timestamp = new Date(timestampValue)
        if (timestamp) {
          var formResponse = form.getResponses(timestamp)[0]
          editResponseUrlValues[i][0] = formResponse.getEditResponseUrl()
          var row = i + 2
          if (row % 10 === 0) {
            spreadsheet.toast('processing rows ' + row + ' to ' + (row + 10))
            editResponseUrlRange.setValues(editResponseUrlValues)
            SpreadsheetApp.flush()
          }
        }
      }
    }
    
    editResponseUrlRange.setValues(editResponseUrlValues)
    SpreadsheetApp.flush()
  }

  registerNewEditResponseURLTrigger()
  SpreadsheetApp.getUi().alert('You are all set! Please check the Form Response Edit URL column in this sheet. Future responses will automatically sync the form response edit url.')
}

function onFormSubmitEvent(e) {
  var sheet = e.range.getSheet()
  var form = FormApp.openByUrl(sheet.getFormUrl())
  var formResponse = form.getResponses().pop()
  addEditResponseURLToSheet({
    sheet: sheet,
    form: form,
    formResponse: formResponse,
    row: e.range.getRow(),
  })
}

Ref :

https://xfanatical.com/blog/how-to-edit-google-forms-responses-in-the-spreadsheet/


Isian Drop Down dari Google Sheet 





/** * Auto-populate Question options in Google Forms * from values in Google Spreadsheet * * Written by Amit Agarwal (MIT License) * **/ const populateGoogleForms = () => { const GOOGLE_SHEET_NAME = "NAMA SHEET ANDA"; const GOOGLE_FORM_ID = "ID GOOGLE FORM"; const ss = SpreadsheetApp.getActiveSpreadsheet(); const [header, ...data] = ss .getSheetByName(GOOGLE_SHEET_NAME) .getDataRange() .getDisplayValues(); const choices = {}; header.forEach((title, i) => { choices[title] = data.map((d) => d[i]).filter((e) => e); }); FormApp.openById(GOOGLE_FORM_ID) .getItems() .map((item) => ({ item, values: choices[item.getTitle()], })) .filter(({ values }) => values) .forEach(({ item, values }) => { switch (item.getType()) { case FormApp.ItemType.CHECKBOX: item.asCheckboxItem().setChoiceValues(values); break; case FormApp.ItemType.LIST: item.asListItem().setChoiceValues(values); break; case FormApp.ItemType.MULTIPLE_CHOICE: item.asMultipleChoiceItem().setChoiceValues(values); break; default: // ignore item } }); ss.toast("Google Form Updated !!"); };

Referensi :

Sunday 13 August 2023

Demo Presentation Day Proyek

 









Kursus Sertifikat

 Unicef









Materi Pembuatan

 

























Materi Content Creator

 
































Canva For Business





Materi Digital Marketing

 



Simple Learn










Google Form - Nanang

  https://www.youtube.com/watch?v=oq585fP21co https://www.youtube.com/watch?v=Kgzi0GYTEsg&list=PLs7Ii4GBXZEzueU1g3BRZgN36HTHvqP4j&in...