Menjeda dan melanjutkan alur kerja menggunakan callback dan Google Spreadsheet


Google Spreadsheet adalah solusi spreadsheet berbasis cloud yang mendukung kolaborasi real-time dan menyediakan alat untuk memvisualisasikan, memproses, dan mengomunikasikan data.

Tutorial ini menunjukkan cara membuat dan men-deploy alur kerja yang membuat endpoint callback (atau webhook), menyimpan URL callback ke Google Spreadsheet, menjeda eksekusi, lalu menunggu persetujuan manusia melalui spreadsheet Spreadsheet untuk memulai ulang alur kerja. Pelajari lebih lanjut cara menggunakan callback.

Tujuan

Dalam tutorial ini, Anda akan:

  1. Buat folder baru di Google Drive. Folder ini digunakan untuk menyimpan spreadsheet dan memungkinkan alur kerja menulis ke spreadsheet.
  2. Buat spreadsheet Google Spreadsheet untuk mengambil persetujuan dan memulai callback ke alur kerja.
  3. Gunakan Google Apps Script, platform JavaScript berbasis cloud yang memungkinkan Anda membuat, membaca, dan mengedit produk Google Workspace secara terprogram, untuk memicu kelanjutan alur kerja yang dijeda setiap kali permintaan disetujui melalui pembaruan pada spreadsheet.
  4. Buat dan deploy alur kerja yang memanggil konektor Google Sheets API untuk menambahkan data ke spreadsheet. Alur kerja dieksekusi, dijeda, lalu dilanjutkan saat callback disetujui melalui spreadsheet. Pelajari konektor Alur Kerja lebih lanjut.
  5. Uji seluruh proses dan pastikan alur kerja berjalan seperti yang diharapkan.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Tutorial ini juga menggunakan Google Workspace. Layanan tingkat bisnis yang tidak disertakan dengan aplikasi konsumen gratis Google dapat ditagih.

Sebelum memulai

Anda dapat menjalankan beberapa perintah berikut di konsol Google Cloud, atau dengan menggunakan Google Cloud CLI di terminal atau Cloud Shell.

Batasan keamanan yang ditentukan oleh organisasi mungkin mencegah Anda menyelesaikan langkah-langkah berikut. Untuk mengetahui informasi pemecahan masalah, lihat Mengembangkan aplikasi di lingkungan Google Cloud yang terbatas.

Konsol

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan diaktifkan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.

  3. Aktifkan Compute Engine, Spreadsheet, dan Workflows API.

    Mengaktifkan API

  4. Catat akun layanan default Compute Engine karena Anda akan mengaitkannya dengan alur kerja dalam tutorial ini untuk tujuan pengujian. Project baru yang telah mengaktifkan Compute Engine API memiliki akun layanan ini yang dibuat dengan peran Editor dasar IAM, dan dengan format email berikut:

    PROJECT_NUMBER-compute@

    Anda dapat menemukan nomor project di halaman Welcome di konsol Google Cloud.

    Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM yang berisi izin minimum yang diperlukan dan ikuti prinsip hak istimewa terendah.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Pastikan penagihan diaktifkan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.

  3. Aktifkan Compute Engine, Spreadsheet, dan API Alur Kerja.

    gcloud services enable \
        compute.googleapis.com \
        sheets.googleapis.com \
        workflows.googleapis.com
  4. Catat akun layanan default Compute Engine karena Anda akan mengaitkannya dengan alur kerja dalam tutorial ini untuk tujuan pengujian. Project baru yang telah mengaktifkan Compute Engine API memiliki akun layanan ini yang dibuat dengan peran Editor dasar IAM, dan dengan format email berikut:

    PROJECT_NUMBER-compute@

    Anda dapat mengambil nomor project:

    gcloud projects describe PROJECT_ID

    Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM yang berisi izin minimum yang diperlukan dan ikuti prinsip hak istimewa terendah.

Membuat folder baru di Google Drive

Buat folder baru di Google Drive. Folder ini digunakan untuk menyimpan spreadsheet Anda. Dengan menyiapkan izin untuk folder bersama, alur kerja Anda diizinkan untuk menulis ke spreadsheet.

  1. Buka drive.google.com.
  2. Klik Baru > Folder baru.
  3. Masukkan nama untuk folder.
  4. Klik Create.
  5. Klik kanan folder baru, lalu pilih Bagikan.
  6. Tambahkan alamat email untuk akun layanan default Compute Engine.

    Tindakan ini akan memberi akun layanan akses ke folder. Saat Anda mengaitkan akun layanan dengan alur kerja, alur kerja akan memiliki akses edit ke file apa pun dalam folder. Pelajari lebih lanjut cara berbagi file, folder, & drive.

  7. Pilih peran Editor.

  8. Hapus centang pada kotak Beri tahu orang.

  9. Klik Bagikan.

Membuat spreadsheet menggunakan Google Spreadsheet

Saat Anda membuat spreadsheet melalui Google Spreadsheet, spreadsheet tersebut akan disimpan di Google Drive. Secara default, spreadsheet disimpan ke folder root Anda di Drive. Tidak ada opsi untuk membuat spreadsheet langsung dalam folder yang ditentukan menggunakan Google Sheets API. Namun, ada alternatif, termasuk memindahkan spreadsheet ke folder tertentu setelah Anda membuatnya, seperti yang dilakukan dalam contoh ini. Untuk mengetahui informasi selengkapnya, lihat Menggunakan folder Google Drive.

  1. Buka sheets.google.com.

  2. Klik Baru Plus.

    Tindakan ini akan membuat dan membuka spreadsheet baru Anda. Setiap spreadsheet memiliki nilai spreadsheetId unik, yang berisi huruf, angka, tanda hubung, atau garis bawah. Anda dapat menemukan ID spreadsheet di URL Google Spreadsheet:

    https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0

  3. Catat ID ini karena akan diperlukan saat Anda membuat alur kerja.

  4. Tambahkan judul kolom agar cocok dengan contoh berikut:

    Contoh spreadsheet untuk mencatat persetujuan

    Perhatikan bahwa nilai di kolom G, Disetujui?, digunakan untuk memulai callback dalam alur kerja.

  5. Pindahkan spreadsheet ke folder Google Drive yang Anda buat sebelumnya:

    1. Di spreadsheet, pilih File > Pindahkan.
    2. Buka folder yang Anda buat.
    3. Klik Pindahkan.

Anda juga dapat menggunakan konektor Google Sheets API untuk membuat spreadsheet. Perhatikan bahwa saat menggunakan konektor, spreadsheetId dapat diambil dari hasil resp. Contoh:

- create_spreadsheet:
    call: googleapis.sheets.v4.spreadsheets.create
    args:
      body:
      connector_params:
        scopes: ${driveScope}
    result: resp
- assign_sheet_id:
    assign:
      - sheetId: ${resp.spreadsheetId}

Memperluas Google Spreadsheet menggunakan Apps Script

Apps Script memungkinkan Anda membuat, membaca, dan mengedit Google Spreadsheet secara terprogram. Sebagian besar skrip yang dirancang untuk Spreadsheet memanipulasi array untuk berinteraksi dengan sel, baris, dan kolom dalam spreadsheet. Untuk pengantar penggunaan Apps Script dengan Google Spreadsheet, lihat Panduan memulai fungsi kustom.

  1. Membuat project Apps Script dari Google Spreadsheet:

    1. Buka spreadsheet Spreadsheet Anda.
    2. Pilih Ekstensi > Apps Script.
    3. Di editor skrip, klik Project tanpa judul.
    4. Beri nama project Anda, lalu klik Ganti nama.

    Skrip Anda kini terikat ke spreadsheet, yang memberi skrip kemampuan khusus untuk mengubah antarmuka pengguna atau merespons saat spreadsheet dibuka.

    Project skrip mewakili kumpulan file dan resource Apps Script. File kode dalam project skrip memiliki ekstensi .gs.

  2. Anda dapat menggunakan Apps Script untuk menulis fungsi kustom yang dapat Anda gunakan di Google Spreadsheet seperti fungsi bawaan. Fungsi kustom dibuat menggunakan JavaScript standar. Buat fungsi:

    1. Buka project Apps Script Anda.
    2. Klik Editor .
    3. File skrip akan muncul sebagai file project bernama Code.gs. Untuk mengedit file, pilih file tersebut.
    4. Ganti kode apa pun di editor skrip dengan kode berikut yang membaca data di spreadsheet dan meneruskannya sebagai input ke eksekusi alur kerja:

      function handleEdit(e) {
        var range = e.range.getA1Notation();
        var sheet = e.source;
      
        if (range.length > 1 && range[0] === 'G') {
          if (e.value == "TRUE") {
            Logger.log("Approved: TRUE");
      
            var row = range.slice(1);
            var url = sheet.getRange('E' + row).getCell(1, 1).getValue();
            var approver = sheet.getRange('F' + row).getCell(1, 1).getValue();
      
            callback(url, approver);
          }
          else {
            Logger.log("Approved: FALSE");
          }
        }
      }
      
      function callback(url, approver) {
        const headers = {
          "Authorization": "Bearer " + ScriptApp.getOAuthToken()
        };
      
        var payload = {
          'approver': approver
        };
      
        const params = {
          "method": 'POST',
          "contentType": 'application/json',
          "headers": headers,
          "payload": JSON.stringify(payload)
        };
      
      
        Logger.log("Workflow callback request to " + url);
        var response = UrlFetchApp.fetch(url, params);
        Logger.log(response);
      }
    5. Klik Simpan .

  3. Pemicu yang dapat diinstal Apps Script memungkinkan project skrip menjalankan fungsi yang ditentukan saat kondisi tertentu terpenuhi, seperti saat spreadsheet dibuka atau diedit. Buat pemicu:

    1. Buka project Apps Script Anda.
    2. Klik Pemicu .
    3. Klik Add Trigger.
    4. Pada dialog Add Trigger for YOUR_PROJECT_NAME, konfigurasikan pemicu:
      1. Dalam daftar Pilih fungsi yang akan dijalankan, pilih handleEdit.
      2. Dalam daftar Pilih deployment yang akan dijalankan, pilih Head.
      3. Dalam daftar Select event source, pilih From spreadsheet.
      4. Di daftar Select event type, pilih On edit.
      5. Dalam daftar Setelan notifikasi kegagalan, pilih Beri tahu saya setiap hari.
    5. Klik Simpan.
    6. Jika Anda menerima perintah untuk memilih Akun Google, pilih akun yang sesuai, lalu klik Izinkan.

      Tindakan ini memungkinkan project Apps Script Anda melihat, mengedit, membuat, dan menghapus spreadsheet Google Spreadsheet; serta terhubung ke layanan eksternal.

  4. File manifes project Apps Script adalah file JSON yang menentukan informasi project dasar yang diperlukan Apps Script untuk menjalankan skrip dengan sukses. Perhatikan bahwa editor Apps Script menyembunyikan file manifes secara default untuk melindungi setelan project Apps Script Anda. Edit file manifes:

    1. Buka project Apps Script Anda.
    2. Klik Setelan Project .
    3. Pilih kotak centang Tampilkan file manifes "appsscript.json" dalam editor.
    4. Klik Editor .
    5. File manifes muncul sebagai file project bernama appsscript.json. Untuk mengedit file, pilih file tersebut.
    6. Kolom oauthScopes menentukan array string. Untuk menetapkan cakupan otorisasi yang digunakan project Anda, tambahkan array dengan cakupan yang ingin didukung. Contoh:

      {
        "timeZone": "America/Toronto",
        "dependencies": {
        },
        "exceptionLogging": "STACKDRIVER",
        "runtimeVersion": "V8",
        "oauthScopes": [
          "https://www.googleapis.com/auth/script.external_request",
          "https://www.googleapis.com/auth/cloud-platform",
          "https://www.googleapis.com/auth/spreadsheets"
        ]
      }

      Tindakan ini menetapkan cakupan eksplisit ke:

      • Menghubungkan ke layanan eksternal
      • Melihat, mengedit, mengonfigurasi, dan menghapus data Google Cloud Anda serta melihat alamat email untuk Akun Google Anda
      • Melihat, mengedit, membuat, dan menghapus semua spreadsheet Google Spreadsheet Anda
    7. Klik Simpan .

Men-deploy alur kerja yang menulis ke spreadsheet dan menggunakan callback

Men-deploy alur kerja yang dieksekusi, dijeda, lalu dilanjutkan saat callback disetujui melalui spreadsheet. Alur kerja menulis ke spreadsheet Sheets menggunakan konektor Google Sheets API.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows:

    Buka Workflows

  2. Klik Buat.

  3. Masukkan nama untuk alur kerja baru: workflows-awaits-callback-sheets.

  4. Di daftar Region, pilih us-central1 (Iowa).

  5. Untuk Service account, pilih akun layanan default Compute Engine (PROJECT_NUMBER-compute@).

  6. Klik Berikutnya.

  7. Di editor alur kerja, masukkan definisi berikut untuk alur kerja Anda:

    main:
      steps:
        - init:
            assign:
            # Replace with your sheetId and make sure the service account
            # for the workflow has write permissions to the sheet
            - sheetId: "10hieAH6b-oMeIVT_AerSLNxQck14IGhgi8ign-x2x8g"
        - before_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here before waiting for callback from sheets"}
        - wait_for_sheets_callback:
            call: await_callback_sheets
            args:
              sheetId: ${sheetId}
            result: await_callback_result
        - after_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here after receiving callback from sheets"}
        - returnResult:
            return: ${await_callback_result}
    
    await_callback_sheets:
        params: [sheetId]
        steps:
            - init:
                assign:
                  - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
                  - workflow_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_ID")}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_to_sheets:
                call: googleapis.sheets.v4.spreadsheets.values.append
                args:
                    range: ${"Sheet1!A1:G1"}
                    spreadsheetId: ${sheetId}
                    valueInputOption: RAW
                    body:
                        majorDimension: "ROWS"
                        values:
                          - ["${project_id}", "${location}", "${workflow_id}", "${execution_id}", "${callback_details.url}", "", "FALSE"]
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting for callback from sheet " + sheetId}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for callback from sheet " + sheetId}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - check_null_await_result:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${"Approved by " + callback_request.http_request.body.approver}
            - return_await_result:
                return: ${callback_request.http_request.body}
  8. Pastikan Anda mengganti nilai placeholder sheetId dengan spreadsheetId Anda.

  9. Klik Deploy.

gcloud

  1. Buat file kode sumber untuk alur kerja Anda:

    touch workflows-awaits-callback-sheets.yaml
  2. Di editor teks, salin alur kerja berikut ke file kode sumber Anda:

    main:
      steps:
        - init:
            assign:
            # Replace with your sheetId and make sure the service account
            # for the workflow has write permissions to the sheet
            - sheetId: "10hieAH6b-oMeIVT_AerSLNxQck14IGhgi8ign-x2x8g"
        - before_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here before waiting for callback from sheets"}
        - wait_for_sheets_callback:
            call: await_callback_sheets
            args:
              sheetId: ${sheetId}
            result: await_callback_result
        - after_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here after receiving callback from sheets"}
        - returnResult:
            return: ${await_callback_result}
    
    await_callback_sheets:
        params: [sheetId]
        steps:
            - init:
                assign:
                  - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
                  - workflow_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_ID")}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_to_sheets:
                call: googleapis.sheets.v4.spreadsheets.values.append
                args:
                    range: ${"Sheet1!A1:G1"}
                    spreadsheetId: ${sheetId}
                    valueInputOption: RAW
                    body:
                        majorDimension: "ROWS"
                        values:
                          - ["${project_id}", "${location}", "${workflow_id}", "${execution_id}", "${callback_details.url}", "", "FALSE"]
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting for callback from sheet " + sheetId}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for callback from sheet " + sheetId}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - check_null_await_result:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${"Approved by " + callback_request.http_request.body.approver}
            - return_await_result:
                return: ${callback_request.http_request.body}
  3. Pastikan Anda mengganti nilai placeholder sheetId dengan spreadsheetId Anda.

  4. Deploy alur kerja dengan memasukkan perintah berikut:

    gcloud workflows deploy workflows-awaits-callback-sheets \
        --source=workflows-awaits-callback-sheets.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@

    Ganti PROJECT_NUMBER dengan nomor project Google Cloud Anda. Anda dapat mengambil nomor project:

    gcloud projects describe PROJECT_ID

Menguji alur menyeluruh

Jalankan alur kerja untuk menguji alur menyeluruh. Mengeksekusi alur kerja akan menjalankan definisi alur kerja saat ini yang terkait dengan alur kerja.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows:

    Buka Workflows

  2. Di halaman Workflows, pilih alur kerja workflows-awaits-callback-sheets untuk membuka halaman detailnya.

  3. Di halaman Workflow details, klik Execute.

  4. Klik Execute lagi.

    Alur kerja dimulai dan status eksekusinya harus Running. Log juga menunjukkan bahwa alur kerja dijeda dan menunggu:

    Execute steps here before waiting for callback from sheets
    ...
    Started waiting for callback from sheet 1JlNFFnqs760M_KDqeeeDc_qtrABZDxoalyCmRE39dpM
  5. Pastikan alur kerja telah menulis detail callback ke baris di spreadsheet Anda.

    Misalnya, Anda akan melihat ID eksekusi alur kerja di kolom Execution ID, endpoint callback di kolom Callback URL, dan SALAH di kolom Disetujui?.

  6. Di spreadsheet, ubah SALAH menjadi BENAR.

    Setelah satu atau dua menit, eksekusi akan dilanjutkan, lalu selesai dengan status eksekusi Berhasil.

gcloud

  1. Buka terminal.

  2. Menjalankan alur kerja:

      gcloud workflows run workflows-awaits-callback-sheets

    Alur kerja dimulai dan output akan menunjukkan bahwa alur kerja dijeda dan menunggu:

      Waiting for execution [a8361789-90e0-467f-8bd7-ea1c81977820] to complete...working.

  3. Pastikan alur kerja telah menulis detail callback ke baris di spreadsheet Anda.

    Misalnya, Anda akan melihat ID eksekusi alur kerja di kolom Execution ID, endpoint callback di kolom Callback URL, dan SALAH di kolom Disetujui?.

  4. Di spreadsheet, ubah SALAH menjadi BENAR.

    Setelah satu atau dua menit, eksekusi akan dilanjutkan, lalu selesai dengan status eksekusi SUCCEEDED.

Pembersihan

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource yang dibuat dalam tutorial ini

  1. Menghapus file di Google Drive.
  2. Menghapus alur kerja.

Langkah selanjutnya