คู่มือนี้จะอธิบายวิธีจัดการข้อผิดพลาดที่เกิดขึ้นเมื่อขั้นตอนของโฟลว์ทำงาน คุณสามารถระบุได้ว่าขั้นตอนที่ล้มเหลวต้องให้ผู้ใช้ดำเนินการเพื่อแก้ไขหรือไม่ หรือจะลองอีกครั้งได้หรือไม่
- แสดงข้อผิดพลาดที่ดำเนินการได้: เพิ่มปุ่มลงในบันทึกข้อผิดพลาดซึ่งจะนำผู้ใช้ไปยังการ์ดการกำหนดค่าของขั้นตอนดังกล่าว เพื่อให้ผู้ใช้แก้ไขข้อมูลที่ป้อนเพื่อแก้ไขข้อผิดพลาดได้ หากต้องการทําเครื่องหมายข้อผิดพลาดว่าดําเนินการได้ ให้ส่งกลับ
AddOnsResponseService.ErrorActionability.ACTIONABLEหากต้องการทำเครื่องหมายข้อผิดพลาดว่าดำเนินการไม่ได้ ให้ส่งคืนAddOnsResponseService.ErrorActionability.NOT_ACTIONABLE - ลองขั้นตอนอีกครั้งหลังจากเกิดข้อผิดพลาด: โฟลว์จะพยายามเรียกใช้ขั้นตอนอีกครั้งสูงสุด 5 ครั้งก่อนที่จะหยุด หากต้องการทำเครื่องหมายข้อผิดพลาดว่าลองอีกครั้งได้ ให้ส่งคืน
AddOnsResponseService.ErrorRetryability.RETRYABLEหากต้องการทำเครื่องหมายข้อผิดพลาดที่ลองอีกครั้งไม่ได้ ให้ส่งคืนAddOnsResponseService.ErrorRetryability.NOT_RETRYABLE
นอกจากนี้ คุณยังสร้างบันทึกข้อผิดพลาดที่กำหนดเองด้วยชิป ไฮเปอร์ลิงก์ และข้อความที่มีการจัดรูปแบบ เพื่อให้บริบทที่ละเอียดยิ่งขึ้นเกี่ยวกับข้อผิดพลาดแก่ผู้ใช้ได้ด้วย
แสดงข้อผิดพลาดที่นำไปใช้ได้จริง
ตัวอย่างต่อไปนี้สร้างขั้นตอนที่ขอให้ผู้ใช้ป้อนตัวเลขติดลบ หากผู้ใช้ป้อนตัวเลขที่เป็นบวก ขั้นตอนจะแสดงข้อผิดพลาดที่ดำเนินการได้ซึ่งแจ้งให้ผู้ใช้แก้ไขอินพุต
ไฟล์ Manifest ต่อไปนี้กําหนดอินพุต เอาต์พุต และฟังก์ชันของขั้นตอนที่จะเรียกใช้สําหรับการกําหนดค่าและการเรียกใช้
JSON
{
"timeZone": "America/Toronto",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "Retry Errors Example",
"logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
"useLocaleFromApp": true
},
"flows": {
"workflowElements": [
{
"id": "returnElementError",
"state": "ACTIVE",
"name": "Return Element Error Action",
"description": "To notify the user that some error has occurred",
"workflowAction": {
"inputs": [
{
"id": "value1",
"description": "The input from the user",
"cardinality": "SINGLE",
"dataType": {
"basicType": "STRING"
}
}
],
"outputs": [
{
"id": "output_1",
"description": "The output",
"cardinality": "SINGLE",
"dataType": {
"basicType": "STRING"
}
}
],
"onConfigFunction": "onConfiguration",
"onExecuteFunction": "onExecution"
}
}
]
}
}
}
โค้ดต่อไปนี้สร้างการ์ดการกำหนดค่าและจัดการตรรกะการดำเนินการ รวมถึงการจัดการข้อผิดพลาด
Apps Script
/**
* Returns a configuration card for the step.
* This card contains a text input field for the user.
*/
function onConfiguration() {
let section = CardService.newCardSection()
.addWidget(CardService.newTextInput()
.setFieldName("value1")
.setId("value1")
.setTitle("Please input negative numbers!"));
const card = CardService.newCardBuilder().addSection(section).build();
return card;
}
/**
* Gets an integer value from variable data, handling both string and integer formats.
* @param {Object} variableData The variable data object from the event.
* @return {number} The extracted integer value.
*/
function getIntValue(variableData) {
if (variableData.stringValues) {
return parseInt(variableData.stringValues[0]);
}
return variableData.integerValues[0];
}
/**
* Executes the step.
* If the user input is a positive number, it throws an error and returns an
* actionable error message. Otherwise, it returns the input as an output variable.
* @param {Object} e The event object from the workflow.
*/
function onExecution(e) {
try {
var input_value = getIntValue(e.workflow.actionInvocation.inputs["value1"]);
if (input_value > 0) {
throw new Error('Found invalid positive input value!');
}
// If execution is successful, return the output variable and a log.
const styledText_1 = AddOnsResponseService.newStyledText()
.setText("Execution completed, the number you entered was: ")
.addStyle(AddOnsResponseService.TextStyle.ITALIC)
.addStyle(AddOnsResponseService.TextStyle.UNDERLINE);
const styledText_2 = AddOnsResponseService.newStyledText().setText(input_value)
.setFontWeight(AddOnsResponseService.FontWeight.BOLD);
const workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
.setVariables({
"output_1": AddOnsResponseService.newVariableData().addStringValue(input_value)
})
.setLog(AddOnsResponseService.newWorkflowTextFormat()
.addTextFormatElement(
AddOnsResponseService.newTextFormatElement().setStyledText(styledText_1)
).addTextFormatElement(
AddOnsResponseService.newTextFormatElement().setStyledText(styledText_2)
));
let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
} catch (err) {
// If an error occurs, return an actionable error action.
Logger.log('An error occurred: ' + err.message);
const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
// Sets the user-facing error message.
.setErrorLog(
AddOnsResponseService.newWorkflowTextFormat()
.addTextFormatElement(
AddOnsResponseService.newTextFormatElement().setText("Failed because of invalid input values!"))
)
// Makes the error actionable, allowing the user to correct the input.
.setErrorActionability(AddOnsResponseService.ErrorActionability.ACTIONABLE)
// Specifies that the error is not automatically retried.
.setErrorRetryability(AddOnsResponseService.ErrorRetryability.NOT_RETRYABLE);
let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
}
}
ลองทำขั้นตอนอีกครั้งหลังจากเกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้สร้างขั้นตอนที่จำลองความล้มเหลวชั่วคราว หากเกิดข้อผิดพลาด ขั้นตอนจะแสดงข้อผิดพลาดที่ลองใหม่ได้ ซึ่งทำให้โฟลว์เรียกใช้ขั้นตอนอีกครั้ง
ไฟล์ Manifest จะกำหนดขั้นตอน
JSON
{
"timeZone": "America/Toronto",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "Retry Errors Example",
"logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
"useLocaleFromApp": true
},
"flows": {
"workflowElements": [
{
"id": "retryError",
"state": "ACTIVE",
"name": "Retry an error",
"description": "Simulates a temporary failure and retries the step.",
"workflowAction": {
"inputs": [
{
"id": "value1",
"description": "Any input value",
"cardinality": "SINGLE",
"dataType": {
"basicType": "STRING"
}
}
],
"outputs": [
{
"id": "output_1",
"description": "The output",
"cardinality": "SINGLE",
"dataType": {
"basicType": "STRING"
}
}
],
"onConfigFunction": "onRetryConfiguration",
"onExecuteFunction": "onRetryExecution"
}
}
]
}
}
}
โค้ดต่อไปนี้สร้างการ์ดการกำหนดค่าและจัดการตรรกะการลองใหม่
Apps Script
/**
* Returns a configuration card for the step.
* This card contains a text input field for the user.
*/
function onRetryConfiguration() {
let section = CardService.newCardSection()
.addWidget(CardService.newTextInput()
.setFieldName("value1")
.setId("value1")
.setTitle("Enter any value"));
const card = CardService.newCardBuilder().addSection(section).build();
return card;
}
/**
* Executes the step and simulates a transient error.
* This function fails 80% of the time. When it fails, it returns an
* error that can be retried.
* @param {Object} e The event object from the workflow.
*/
function onRetryExecution(e) {
try {
// Simulate a transient error that fails 80% of the time.
if (Math.random() < 0.8) {
throw new Error('Simulated transient failure!');
}
// If execution is successful, return the output variable and a log.
var input_value = e.workflow.actionInvocation.inputs["value1"].stringValues[0];
const styledText = AddOnsResponseService.newStyledText()
.setText(`Execution succeeded for input: ${input_value}`);
const workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
.setVariables({
"output_1": AddOnsResponseService.newVariableData().addStringValue(input_value)
})
.setLog(AddOnsResponseService.newWorkflowTextFormat()
.addTextFormatElement(
AddOnsResponseService.newTextFormatElement().setStyledText(styledText)
));
let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
} catch (err) {
// If a transient error occurs, return an error message saying the step tries to run again.
Logger.log('A error occurred, trying to run the step again: ' + err.message);
const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
// Sets the user-facing error message.
.setErrorLog(
AddOnsResponseService.newWorkflowTextFormat()
.addTextFormatElement(
AddOnsResponseService.newTextFormatElement().setText("A temporary error occurred. The step will be retried."))
)
// Makes the error not actionable by the user.
.setErrorActionability(AddOnsResponseService.ErrorActionability.NOT_ACTIONABLE)
// Specifies that the error is automatically retried.
.setErrorRetryability(AddOnsResponseService.ErrorRetryability.RETRYABLE);
let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
}
}