Acione um fluxo de trabalho a partir do Google Sheets

O Google Sheets é uma solução de folha de cálculo baseada na nuvem que suporta a colaboração em tempo real e oferece ferramentas para visualizar, processar e comunicar dados.

Este tutorial demonstra como acionar fluxos de trabalho a partir do Sheets.

Crie um formulário para pedir instâncias de VM

Crie um formulário que possa ser usado para enviar um pedido de criação de uma instância de máquina virtual (VM) do Compute Engine. Por predefinição, quando cria um formulário através do Google Forms, este é guardado no Google Drive.

  1. Aceda a forms.google.com.
  2. Clique em Em branco Plus.

    É aberto um novo formulário.

  3. Criar um formulário com cinco secções obrigatórias. O formulário deve ter um aspeto semelhante ao seguinte:

    Veja o formulário de exemplo

    Exemplo de formulário para pedir a criação de uma máquina virtual do Google Cloud
    Nome do computador

    Texto de resposta curta

    Zona

    Menu pendente:

    1. us-central1-a
    2. us-central1-b
    3. us-central1-c
    4. us-central1-f
    Tipo

    Menu pendente:

    1. e2-micro
    2. e2-small
    3. e2-medium
    4. e2-standard-2
    5. e2-standard-4
    Tamanho do disco (GB)

    Texto de resposta curta

    Sistema operativo

    Menu pendente:

    1. debian-10
    2. centos-stream-9
    3. cos-93-lts
    4. cos-97-lts
  4. Ative a recolha de emails para registar os endereços de email das pessoas que preenchem o seu formulário:
    1. Clique em Definições.
    2. Expanda a secção Respostas.
    3. Clique no botão Recolher endereços de email.

Depois de criar um formulário, associe-lhe uma folha de cálculo para poder guardar as respostas do formulário nessa folha de cálculo. A folha de cálculo é guardada no Drive.

  1. Abra o formulário no Forms.
  2. Clique em Respostas.
  3. Clique em Associar ao Sheets.
  4. Na caixa de diálogo Selecionar o destino das respostas, selecione Criar uma nova folha de cálculo.
  5. Clique em Criar.

    A folha de cálculo associada é aberta.

  6. Na coluna H, adicione um cabeçalho Approved?.

  7. Coloque o cursor na primeira linha da coluna H e selecione Inserir > Caixa de verificação.

    A folha de cálculo deve ter um aspeto semelhante ao seguinte:

    Exemplo de folha de cálculo associada para recolher pedidos

    Sempre que a folha é atualizada com uma resposta, a caixa de verificação também aparece na linha dessa resposta.

Expanda o Google Sheets com o Apps Script

O Apps Script permite-lhe criar, ler e editar folhas de cálculo de forma programática. A maioria dos scripts concebidos para o Sheets manipulam matrizes para interagir com as células, as linhas e as colunas numa folha de cálculo. Para uma introdução à utilização do Apps Script com o Sheets, consulte o Início rápido de funções personalizadas.

  1. Crie um projeto do Apps Script a partir do Sheets:

    1. Abra a folha de cálculo do Sheets.
    2. Selecione Extensões > Apps Script.
    3. No editor de scripts, clique em Projeto sem título.
    4. Atribua um nome ao projeto e clique em Mudar o nome.

    O script está agora associado à folha de cálculo, o que confere ao script a capacidade de alterar a interface do utilizador ou responder quando a folha de cálculo é aberta.

    Um projeto de script representa uma coleção de ficheiros e recursos do Apps Script. Os ficheiros de código num projeto de script têm uma extensão..gs

  2. Pode usar o Apps Script para escrever funções personalizadas que pode usar no Sheets tal como uma função incorporada. As funções personalizadas são criadas com JavaScript padrão. Crie uma função:

    1. Abra o seu projeto do Apps Script.
    2. Clique em Editor .
    3. Um ficheiro de script é apresentado como um ficheiro de projeto com o nome Code.gs. Para editar o ficheiro, selecione-o.
    4. Substitua qualquer código no editor de scripts pelo seguinte código que lê os dados na sua folha de cálculo e transmite-os como entrada para uma execução do fluxo de trabalho:

      const PROJECT_ID = "your-project-id";
      const REGION = "us-central1";
      const WORKFLOW = "create-vm-from-form";
      
      function handleEdit(e) {
        var range = e.range.getA1Notation();
        var sheet = e.source;
      
        if (range.length > 1 && range[0] === 'H') {
          if (e.value == "TRUE") {
            Logger.log("Approved checkbox: true");
      
            var row = range.slice(1)
            var email = sheet.getRange('B' + row).getCell(1, 1).getValue()
            var vmName = sheet.getRange('c' + row).getCell(1, 1).getValue()
            var zone = sheet.getRange('D' + row).getCell(1, 1).getValue()
            var machineType = sheet.getRange('E' + row).getCell(1, 1).getValue()
            var diskSize = sheet.getRange('F' + row).getCell(1, 1).getValue()
            var imageFamily = sheet.getRange('G' + row).getCell(1, 1).getValue()
            var imageProject = imageFamily.substring(0, imageFamily.indexOf('-')) + "-cloud"
      
            const executionPayload = {
              "argument": "{\"diskSize\": \"" + diskSize + "\", \"email\": \"" + email + "\", \"imageFamily\": \"" + imageFamily + "\", \"imageProject\": \"" + imageProject + "\", \"machineType\": \"" + machineType + "\", \"vmName\": \"" + vmName + "\", \"zone\": \"" + zone +  "\"}"
            };
      
            approve(executionPayload);
          }
          else {
            Logger.log("Approved checkbox: false");
          }
        }
      }
      
      function approve(executionPayload) {
        const headers = {
          "Authorization": "Bearer " + ScriptApp.getOAuthToken()
        };
      
        const params = {
          "method": 'post',
          "contentType": 'application/json',
          "headers": headers,
          "payload": JSON.stringify(executionPayload)
        };
      
        const url = "https://workflowexecutions.googleapis.com/v1/projects/" + PROJECT_ID + "/locations/" + REGION + "/workflows/" + WORKFLOW + "/executions";
      
        Logger.log("Workflow execution request to " + url);
        var response = UrlFetchApp.fetch(url, params);
        Logger.log(response);
      }
    5. Substitua your-project-id pelo ID do seu Google Cloud projeto.

      Pode encontrar o ID do projeto na página Boas-vindas da Google Cloud consola.

    6. Clique em Guardar .

  3. Os acionadores instaláveis do Apps Script permitem que um projeto de script execute uma função especificada quando determinadas condições são cumpridas, como quando uma folha de cálculo é aberta ou editada. Crie um acionador:

    1. Abra o seu projeto do Apps Script.
    2. Clique em Acionadores .
    3. Clique em Adicionar acionador.
    4. Na caixa de diálogo Adicionar acionador para YOUR_PROJECT_NAME, configure o acionador:
      1. Na lista Escolha a função a executar, selecione handleEdit.
      2. Na lista Escolha a implementação que deve ser executada, selecione Principal.
      3. Na lista Selecionar origem do evento, selecione Da folha de cálculo.
      4. Na lista Selecionar tipo de evento, selecione Na edição.
      5. Na lista Definições de notificação de falhas, selecione Notificar-me diariamente.
    5. Clique em Guardar.
    6. Se receber um pedido para escolher uma Conta Google, selecione a conta adequada e, de seguida, clique em Permitir.

      Isto permite que o seu projeto do Apps Script veja, edite, crie e elimine as suas folhas de cálculo do Sheets, bem como se ligue a um serviço externo.

  4. Um ficheiro de manifesto de um projeto do Apps Script é um ficheiro JSON que especifica informações básicas do projeto que o Apps Script precisa para executar um script com êxito. Tenha em atenção que o editor do Apps Script oculta os ficheiros de manifesto por predefinição para proteger as definições do seu projeto do Apps Script. Edite o ficheiro de manifesto:

    1. Abra o seu projeto do Apps Script.
    2. Clique em Definições do projeto .
    3. Selecione a caixa de verificação Mostrar ficheiro de manifesto "appsscript.json" no editor.
    4. Clique em Editor .
    5. O ficheiro de manifesto aparece como um ficheiro de projeto com o nome appsscript.json. Para editar o ficheiro, selecione-o.
    6. O campo oauthScopes especifica uma matriz de strings. Para definir os âmbitos de autorização que o seu projeto usa, adicione uma matriz com os âmbitos que quer suportados. Por exemplo:

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

      Isto define âmbitos explícitos para:

      • Ligar a um serviço externo
      • Ver, editar, configurar e eliminar os seus Google Cloud dados e ver o endereço de email da sua Conta Google
      • Ver, editar, criar e eliminar todas as suas folhas de cálculo do Sheets
    7. Clique em Guardar .

Implemente um fluxo de trabalho que crie uma instância de VM

Implemente um fluxo de trabalho acionado quando um pedido de criação de uma instância de VM é aprovado. O fluxo de trabalho chama o conetor da API Compute Engine para criar uma instância de VM do Compute Engine com base nas especificações recolhidas através do formulário.

Consola

  1. Na Google Cloud consola, aceda à página Fluxos de trabalho:

    Aceda a Fluxos de trabalho

  2. Clique em Criar.

  3. Introduza um nome para o novo fluxo de trabalho: create-vm-from-form.

  4. Na lista Região, selecione us-central1 (Iowa).

  5. Para a Conta de serviço, selecione a conta de serviço predefinida do Compute Engine (PROJECT_NUMBER-compute@developer.gserviceaccount.com).

  6. Clicar em Seguinte.

  7. No editor de fluxos de trabalho, introduza a seguinte definição para o seu fluxo de trabalho:

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  8. Clique em Implementar.

gcloud

  1. Crie um ficheiro de código-fonte para o seu fluxo de trabalho:

    touch create-vm-from-form.yaml
  2. Num editor de texto, copie o seguinte fluxo de trabalho para o ficheiro de código-fonte:

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  3. Implemente o fluxo de trabalho introduzindo o seguinte comando:

    gcloud workflows deploy create-vm-from-form \
        --source=create-vm-from-form.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Substitua PROJECT_NUMBER pelo seu Google Cloud número do projeto. Pode obter o número do projeto:

    gcloud projects describe PROJECT_ID

Teste o fluxo integral

Para confirmar que tudo está a funcionar como esperado, experimente executar todo o processo.

  1. Envie o formulário para si e responda às perguntas de forma adequada.

    Certifique-se de que as especificações que usa para criar uma instância de VM são válidas; caso contrário, a execução do fluxo de trabalho falha. Para mais informações, consulte o artigo Família de máquinas de uso geral do Compute Engine.

  2. Para enviar a sua resposta, clique em Enviar.

  3. Abra o formulário no Forms.

  4. Clique em Respostas.

  5. Clique em Ver no Sheets.

    A folha de cálculo associada é aberta.

  6. Na linha da sua resposta, selecione a caixa de verificação Aprovado?.

  7. Abra o seu projeto do Apps Script.

  8. Clique em Execuções .

    O acionador deve ser executado e apresentado com o estado Completed.

  9. Confirme que o fluxo de trabalho create-vm-from-form foi concluído com êxito:

    Consola

    1. Na Google Cloud consola, aceda à página Fluxos de trabalho.

      Aceda a Fluxos de trabalho

    2. Na página Fluxos de trabalho, clique no fluxo de trabalho create-vm-from-form para aceder à respetiva página de detalhes.

    3. Na página Detalhes do fluxo de trabalho, para aceder aos detalhes de uma execução específica, clique no ID de execução adequado.

      O Estado de execução deve ser Succeeded e, no painel Input, deve ver as especificações da VM que pediu.

    gcloud

    Recupere uma lista das tentativas de execução do seu fluxo de trabalho:

    gcloud workflows executions list create-vm-from-form

    O resultado deve ser semelhante ao seguinte:

    NAME: projects/918619793306/locations/us-central1/workflows/create-vm-from-form/executions/d8947ecb-9ccb-4ea1-ba10-e5c10414e3be
    STATE: SUCCEEDED
    START_TIME: 2023-01-24T15:07:40.404741791Z
    END_TIME: 2023-01-24T15:07:55.649373625Z
  10. Confirme que foi criada uma nova VM conforme esperado:

    Consola

    Na Google Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

    A sua instância de VM deve ser apresentada com um estado que indica que está em execução.

    gcloud

    Apresente uma lista agregada de todas as VMs em todas as zonas de um projeto:

    gcloud compute instances list

    A sua instância de VM deve ser apresentada com um estado que indica que está em execução.

    Para mais informações sobre o comando gcloud compute instances list, consulte a respetiva página de referência.