本指南介绍了如何编写自定义日志和错误消息,以帮助排查 Workspace Studio“活动”标签页中无法运行的步骤。
默认情况下,“Activity”标签页会记录在清单文件中定义的正在运行的步的名称。为了帮助您了解在执行某一步骤期间发生了什么,您还应为该步骤编写自定义日志。如果用户在运行您的步骤时遇到意外行为,日志可以帮助他们了解发生了什么情况。
有用的日志条目具有两个属性:
- 包含指向相应步骤创建或更新的资源的超链接的条状标签。例如,如果您的步骤创建了 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 脚本
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();
}
}