Detén y reanuda un flujo de trabajo mediante devoluciones de llamada y Hojas de cálculo de Google


Hojas de cálculo de Google es una herramienta de solución de hojas de cálculo que permite la colaboración en tiempo real y proporciona herramientas para visualizar, procesar y comunicar datos.

En este instructivo, se muestra cómo crear e implementar un flujo de trabajo que cree un de devolución de llamada (o webhook), guarda la URL de devolución de llamada en Hojas de cálculo de Google. pausa la ejecución y, luego, espera la aprobación manual en la hoja de cálculo para reiniciar el flujo de trabajo. Obtén más información para usar devoluciones de llamada.

Objetivos

En este instructivo, podrás:

  1. Crea una carpeta nueva en Google Drive. Esta carpeta se usa para almacenar tu hoja de cálculo y permite que el flujo de trabajo escriba en la hoja de cálculo.
  2. Crea una hoja de cálculo de Hojas de cálculo de Google para obtener una aprobación y comenzar una devolución de llamada a un flujo de trabajo.
  3. Usa Google Apps Script, un plataforma de JavaScript basada en la nube que te permite crear, leer, y editar los productos de Google Workspace, para activar la reanudación de una llamada de trabajo siempre que se apruebe una solicitud mediante una actualización en la hoja de cálculo.
  4. Crear e implementar un flujo de trabajo que llame a los Conector de la API de Hojas de cálculo de Google para adjuntar datos a la hoja de cálculo. El flujo de trabajo se ejecuta, se detiene y, luego, se reanuda cuando se aprueba una devolución de llamada a través de la hoja de cálculo. Obtén más información sobre los conectores de Workflows.
  5. Prueba todo el proceso y confirma que el flujo de trabajo procede según lo esperado.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

En el instructivo, también se usa Google Workspace. Servicios de nivel empresarial que no se incluyen en las aplicaciones gratuitas de Google para consumidores son facturables.

Antes de comenzar

Puedes ejecutar algunos de los siguientes comandos en la consola de Google Cloud con Google Cloud CLI en tu terminal o en Cloud Shell.

Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.

Console

  1. En la página del selector de proyectos de la consola de Google Cloud, elige o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.

  3. Habilita las instancias de Compute Engine, Workflows de Google Cloud.

    Habilita las API

  4. Toma nota de las Cuenta de servicio predeterminada de Compute Engine ya que la asociarás con el flujo de trabajo de este instructivo para probar comerciales. Proyectos nuevos que habilitaron la API de Compute Engine crear esta cuenta de servicio con la política de IAM editor y con el siguiente formato de correo electrónico:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Puedes encontrar el número de tu proyecto en la Te damos la bienvenida de la consola de Google Cloud.

    Para entornos de producción, recomendamos crear una cuenta de servicio nueva y lo que le otorga uno o más roles de IAM que contengan el permisos mínimos obligatorios y siguen el principio de privilegio mínimo.

gcloud

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.

  3. Habilita las instancias de Compute Engine, Workflows de Google Cloud.

    gcloud services enable \
        compute.googleapis.com \
        sheets.googleapis.com \
        workflows.googleapis.com
    
  4. Toma nota de las Cuenta de servicio predeterminada de Compute Engine ya que la asociarás con el flujo de trabajo de este instructivo para probar comerciales. Proyectos nuevos que habilitaron la API de Compute Engine crear esta cuenta de servicio con la política de IAM editor y con el siguiente formato de correo electrónico:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Puedes recuperar el número de tu proyecto de la siguiente manera:

    gcloud projects describe PROJECT_ID
    

    Para entornos de producción, recomendamos crear una cuenta de servicio nueva y lo que le otorga uno o más roles de IAM que contengan el permisos mínimos obligatorios y siguen el principio de privilegio mínimo.

Crea una carpeta nueva en Google Drive

Crea una carpeta nueva en Google Drive. Esta carpeta se usa para almacenar tu en una hoja de cálculo. Si configuras un permiso para la carpeta compartida, tu flujo de trabajo tiene permitido escribir en la hoja de cálculo.

  1. Ve a drive.google.com.
  2. Haz clic en Nuevo > Nueva carpeta.
  3. Ingresa un nombre para la carpeta.
  4. Haz clic en Crear.
  5. Haz clic con el botón derecho en la carpeta nueva y selecciona Compartir.
  6. Agrega la dirección de correo electrónico para el servicio predeterminado de Compute Engine de servicio predeterminada.

    Esto le da a la cuenta de servicio acceso a la carpeta. Cuando asocias a la cuenta de servicio con tu flujo de trabajo, este tendrá permiso acceso a cualquier archivo de la carpeta. Más información sobre compartir archivos, carpetas y unidades.

  7. Selecciona el rol Editor.

  8. Desmarca la casilla de verificación Enviar notificaciones a las personas.

  9. Haz clic en Compartir

Crea una hoja de cálculo con Hojas de cálculo de Google

Cuando creas una hoja de cálculo a través de Google Sheets, se guarda en Google Drive De forma predeterminada, la hoja de cálculo se guarda en tu carpeta raíz en Drive No es posible crear una hoja de cálculo directamente dentro de una carpeta específica con la API de Google Sheets. Sin embargo, hay alternativas, que incluyen mover la hoja de cálculo a una carpeta específica después lo creas, como se hace en este ejemplo. Para obtener más información, consulta Trabaja con carpetas de Google Drive.

  1. Ve a sheets.google.com.

  2. Haz clic en Nuevo Plus.

    Esto creará y abrirá tu nueva hoja de cálculo. Cada hoja de cálculo tiene un valor spreadsheetId, que contenga letras, números, guiones o guiones bajos. Puedes encontrar el ID de hoja de cálculo en una URL de Hojas de cálculo de Google:

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

  3. Ten en cuenta este ID, ya que lo necesitarás cuando crees tu flujo de trabajo.

  4. Agrega encabezados de columna que coincidan con el siguiente ejemplo:

    Ejemplo de una hoja de cálculo para registrar aprobaciones

    Ten en cuenta que el valor de la columna G, Approved?, se usa para iniciar de las devoluciones de llamada en el flujo de trabajo.

  5. Mueve la hoja de cálculo a la carpeta de Google Drive que creaste. anteriormente:

    1. En la hoja de cálculo, selecciona Archivo > Mover.
    2. Navega a la carpeta que creaste.
    3. Haz clic en Mover.

También puedes usar Conector de la API de Hojas de cálculo de Google para crear una hoja de cálculo. Ten en cuenta que, cuando uses el conector, spreadsheetId se puede recuperar a partir del resultado resp. Por ejemplo:

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

Amplía Hojas de cálculo de Google con Apps Script

Apps Script te permite crear, leer y editar de manera programática Google Sheets. La mayoría de las secuencias de comandos diseñadas para Hojas de cálculo para interactuar con las celdas, filas y columnas de una hoja de cálculo. Para un introducción al uso de Apps Script con Hojas de cálculo de Google, consulta la guía de inicio rápido sobre funciones personalizadas.

  1. Crea un proyecto de Apps Script a partir de Hojas de cálculo de Google:

    1. Abre tu archivo de Hojas de cálculo.
    2. Selecciona Extensiones > Apps Script.
    3. En el editor de secuencias de comandos, haz clic en Proyecto sin título.
    4. Asígnale un nombre al proyecto y haz clic en Cambiar nombre.

    Ahora la secuencia de comandos está vinculada a la hoja de cálculo lo que le da al script habilidades especiales para alterar la interfaz de usuario o responder cuando se abra la hoja de cálculo.

    Un proyecto de secuencia de comandos representa una colección de Apps Script archivos y recursos. Los archivos de código en un proyecto de secuencia de comandos tienen un .gs. .

  2. Puedes usar Apps Script para escribir funciones personalizadas que que puedes usar en Hojas de cálculo de Google como una función integrada. Las funciones personalizadas se crea con JavaScript estándar. Crea una función:

    1. Abre tu proyecto de Apps Script.
    2. Haz clic en Editor .
    3. Aparecerá un archivo de secuencia de comandos como un archivo de proyecto llamado Code.gs. Para editar el archivo, seleccionarla.
    4. Reemplaza cualquier código en el editor de secuencia de comandos con el siguiente código que dice lo siguiente: los datos de tu hoja de cálculo y los pasa como entrada a un flujo de trabajo ejecución:

      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. Haz clic en Guardar .

  3. Apps Script activadores instalables permiten que un proyecto de secuencia de comandos ejecute una función específica cuando se cumplen ciertas condiciones se cumplen, como cuando se abre o se edita una hoja de cálculo. Crea un activador:

    1. Abre tu proyecto de Apps Script.
    2. Haz clic en Activadores .
    3. Haz clic en Agregar activador.
    4. En el diálogo Agregar activador para YOUR_PROJECT_NAME, configura la activador:
      1. En la lista Elige qué función ejecutar, selecciona handleEdit.
      2. En la lista Choose what deployment should run, selecciona Head.
      3. En la lista Seleccionar la fuente del evento, elige Desde una hoja de cálculo.
      4. En la lista Seleccionar tipo de evento, elige Al editar.
      5. En la lista Configuración de notificaciones de errores, selecciona Notificarme diariamente.
    5. Haz clic en Guardar.
    6. Si recibes un mensaje para elegir una Cuenta de Google, selecciona la cuenta y haz clic en Permitir.

      Esto permite que tu proyecto de Apps Script vea, edite crear y borrar sus hojas de cálculo de Google Sheets y conectarse a un servicio externo.

  4. Un archivo de manifiesto de un proyecto de Apps Script es un archivo JSON que especifica la información básica del proyecto Apps Script necesita ejecutar una secuencia de comandos correctamente. Ten en cuenta que El editor de Apps Script oculta los archivos de manifiesto de forma predeterminada para proteger tu secuencia de comandos configuración del proyecto. Edita el archivo de manifiesto:

    1. Abre tu proyecto de Apps Script.
    2. Haz clic en Configuración del proyecto .
    3. Selecciona la casilla de verificación Mostrar el archivo de manifiesto "appsscript.json" en el editor.
    4. Haz clic en Editor .
    5. El archivo de manifiesto aparece como un archivo de proyecto llamado appsscript.json. Para editar el archivo, seleccionarlo.
    6. El campo oauthScopes especifica un array de cadenas. Para establecer la permisos de autorización usa tu proyecto, agrega un array con los alcances que desees compatibles. Por ejemplo:

      {
        "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"
        ]
      }

      Esto establece los alcances explícitos en:

      • Se conecta a un servicio externo.
      • Ver, editar, configurar y borrar tus datos de Google Cloud y ver la dirección de correo electrónico de tu Cuenta de Google
      • Vea, edite, cree y borre todos sus archivos de Hojas de cálculo de Google
    7. Haz clic en Guardar .

Implementa un flujo de trabajo que escriba en una hoja de cálculo y use devoluciones de llamada

Implementar un flujo de trabajo que se ejecute, se detenga y, luego, se reanude cuando se realice una devolución de llamada aprobado a través de una hoja de cálculo. El flujo de trabajo escribe en un archivo de Hojas de cálculo con el conector de la API de Hojas de cálculo de Google.

Console

  1. En la consola de Google Cloud, ve a Workflows página:

    Ir a Workflows

  2. Haz clic en  Crear.

  3. Ingresa un nombre para el flujo de trabajo nuevo: workflows-awaits-callback-sheets.

  4. En la lista Región, selecciona us-central1 (Iowa).

  5. En Cuenta de servicio, selecciona la configuración predeterminada de Compute Engine cuenta de servicio (PROJECT_NUMBER-compute@developer.gserviceaccount.com).

  6. Haz clic en Siguiente.

  7. En el editor de flujos de trabajo, ingresa la siguiente definición para tu flujo de trabajo:

    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. Asegúrate de reemplazar el valor del marcador de posición sheetId por tu spreadsheetId

  9. Haga clic en Implementar.

gcloud

  1. Crea un archivo de código fuente para tu flujo de trabajo:

    touch workflows-awaits-callback-sheets.yaml
    
  2. En un editor de texto, copia el siguiente flujo de trabajo en tu archivo de código fuente:

    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. Asegúrate de reemplazar el valor del marcador de posición sheetId por tu spreadsheetId

  4. Para implementar el flujo de trabajo, ingresa el siguiente comando:

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

    Reemplaza PROJECT_NUMBER por el número de proyecto de Google Cloud. Puedes recuperar el número de tu proyecto de la siguiente manera:

    gcloud projects describe PROJECT_ID
    

Prueba el flujo de extremo a extremo

Ejecutar el flujo de trabajo para probar el flujo de extremo a extremo Cuando se ejecuta un flujo de trabajo, se ejecuta el definición del flujo de trabajo actual asociada con el flujo de trabajo.

Console

  1. En la consola de Google Cloud, ve a Workflows página:

    Ir a Workflows

  2. En la página Flujos de trabajo, selecciona la workflows-awaits-callback-sheets para ir a la página de detalles.

  3. En la página Detalles del flujo de trabajo, haz clic en Ejecución.

  4. Haz clic de nuevo en Ejecutar.

    Se inicia el flujo de trabajo y su estado de ejecución debe ser Running. El también indican que el flujo de trabajo está detenido y en espera:

    Execute steps here before waiting for callback from sheets
    ...
    Started waiting for callback from sheet 1JlNFFnqs760M_KDqeeeDc_qtrABZDxoalyCmRE39dpM
  5. Verifica que el flujo de trabajo haya escrito los detalles de la devolución de llamada en una fila de tu hoja de cálculo.

    Por ejemplo, deberías ver el ID de ejecución de tu flujo de trabajo en la Columna Execution ID, un extremo de devolución de llamada en la URL de devolución de llamada y FALSE en la columna ¿Aprobado?.

  6. En la hoja de cálculo, cambia FALSO a VERDADERO.

    Al cabo de uno o dos minutos, se debería reanudar la ejecución y, luego, completarse con un estado de ejecución Succeeded.

gcloud

  1. Abre una terminal.

  2. Ejecuta el flujo de trabajo:

      gcloud workflows run workflows-awaits-callback-sheets

    Se inicia el flujo de trabajo y el resultado debe indicar que este está en pausa y en espera:

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

  3. Verifica que el flujo de trabajo haya escrito los detalles de la devolución de llamada en una fila de tu hoja de cálculo.

    Por ejemplo, deberías ver el ID de ejecución de tu flujo de trabajo en la Columna Execution ID, un extremo de devolución de llamada en la URL de devolución de llamada y FALSE en la columna ¿Aprobado?.

  4. En la hoja de cálculo, cambia FALSO a VERDADERO.

    Al cabo de uno o dos minutos, se debería reanudar la ejecución y, luego, completarse con un estado de ejecución de SUCCEEDED.

Limpia

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos que se crearon en este instructivo

  1. Cómo borrar archivos en Google Drive
  2. Borra un flujo de trabajo.

¿Qué sigue?