記錄活動和錯誤

本指南說明如何編寫自訂記錄和錯誤訊息,協助排解 Workspace Studio「活動」分頁中無法執行的步驟。

根據預設,「活動」分頁會記錄步驟名稱,如資訊清單檔案中所定義。為協助您瞭解步驟執行期間發生的情況,您也應為步驟編寫自訂記錄。如果使用者在執行步驟時遇到非預期行為,記錄檔可協助他們瞭解發生了什麼事。

實用的記錄項目有兩項屬性:

  • 這個方塊包含步驟建立或更新的資源超連結。舉例來說,如果步驟會建立 Google 文件,請使用這個資訊方塊連結至建立的 Google 文件。
  • 詳細錯誤訊息,說明步驟無法執行的原因,以及如何解決問題。

下列程式碼範例說明 onExecuteFunctionCreateDocument() 如何將成功執行和錯誤記錄到「活動」分頁。

以下是資訊清單檔案:

JSON

{
  "timeZone": "America/Los_Angeles",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Log and Error Demo",
      "logoUrl": "https://www.gstatic.com/images/branding/productlogos/gsuite_addons/v6/web-24dp/logo_gsuite_addons_color_1x_web_24dp.png",
      "useLocaleFromApp": true
    },
    "flows": {
      "workflowElements": [
        {
          "id": "log_and_error_demo",
          "state": "ACTIVE",
          "name": "Log and Error Demo",
          "description": "Display a log message when executed successfully, display a error message and retry execution instead.",
          "workflowAction": {
            "inputs": [
              {
                "id": "value1",
                "description": "value1",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "INTEGER"
                }
              }
            ],
            "outputs": [
              {
                "id": "result",
                "description": "execution result",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            ],
            "onConfigFunction": "onConfigFunctionCreateDocument",
            "onExecuteFunction": "onExecuteFunctionCreateDocument"
          }
        }
      ]
    }
  }
}

以下是應用程式邏輯程式碼:

Apps Script

function onConfigFunctionCreateDocument() {
  const firstInput = CardService.newTextInput()
    .setFieldName("value1")
    .setTitle("First Value") //"FieldName" must match an "id" in the manifest file's inputs[] array.
    .setHint("Input 1 to successfully execute the step, 0 to fail the step and return an error.")
    .setHostAppDataSource(
      CardService.newHostAppDataSource()
        .setWorkflowDataSource(
          CardService.newWorkflowDataSource()
            .setIncludeVariables(true)
        )
    );

  let cardSection = CardService.newCardSection()
    .addWidget(firstInput);

  return CardService.newCardBuilder()
    .addSection(cardSection)
    .build();
}

function onExecuteFunctionCreateDocument(event) {

  // true if the document is successfully created, false if something goes wrong.
  var successfulRun = event.workflow.actionInvocation.inputs["value1"].integerValues[0];
  console.log("The user input is: ", successfulRun);

  // If successful, return an activity log linking to the created document.
  if (successfulRun == 1) {
    let logChip = AddOnsResponseService.newTextFormatChip()
      .setTextFormatIcon(
        AddOnsResponseService.newTextFormatIcon()
          .setMaterialIconName("edit_document")
      )
      .setUrl("https://docs.google.com/document/d/{DOCUMENT}")
      .setLabel("Mock Document");

    let output = AddOnsResponseService.newVariableData()
      .addStringValue("Created Google Doc");

    const workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
      .addVariableData("result", output)
      // Set the user-facing error log
      .setLog(
        AddOnsResponseService.newWorkflowTextFormat()
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setText("Created Google Doc")
          )
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setTextFormatChip(logChip)
          )
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setText("Created doc detailing how to improve product.")
          )
      );

    let hostAppAction = AddOnsResponseService.newHostAppAction()
      .setWorkflowAction(workflowAction);

    return AddOnsResponseService.newRenderActionBuilder()
      .setHostAppAction(hostAppAction)
      .build();
  }
  // Otherwise, return an activity log containing an error explaining what happened and how to resolve the issue.
  else {
    let errorChip = AddOnsResponseService.newTextFormatChip()
      .setTextFormatIcon(
        AddOnsResponseService.newTextFormatIcon()
          .setMaterialIconName("file_open")
      )
      .setLabel("Mock Document");

    const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
      .setErrorActionability(AddOnsResponseService.ErrorActionability.ACTIONABLE)
      .setErrorRetryability(AddOnsResponseService.ErrorRetryability.NOT_RETRYABLE)
      // Set the user-facing error log
      .setErrorLog(
        AddOnsResponseService.newWorkflowTextFormat()
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setText("Failed to create Google Doc.")
          )
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setTextFormatChip(errorChip)
          )
          .addTextFormatElement(
            AddOnsResponseService.newTextFormatElement()
              .setText("Unable to create Google Document because OAuth verification failed. Grant one of these authorization scopes and try again: https://www.googleapis.com/auth/documents, \nhttps://www.googleapis.com/auth/drive, \nhttps://www.googleapis.com/auth/drive.file")
          )
      );

    let hostAppAction = AddOnsResponseService.newHostAppAction()
      .setWorkflowAction(workflowAction);

    return AddOnsResponseService.newRenderActionBuilder()
      .setHostAppAction(hostAppAction)
      .build();
  }
}