【发布时间】:2020-05-16 00:32:53
【问题描述】:
目标是查询 JSON 对象内的字段。但是在执行时会抛出上面的错误。 Dialogflow 作为应用程序集成在 Slack 中。 Google Apps 脚本是网络应用程序。这是代码:
//Writes in a sheet the Slack User id
function doPost(e) {
//Parse incoming JSON from Dialogflow into an object
var dialogflow = JSON.parse(e.postData.contents);
//Extracts userId from Slack
var desiredField = dialogflow.originalDetectIntentRequest.payload.data.event.user;
//Instantiates Sheets function
var valueRange = Sheets.newValueRange();
//Value to insert in cell
var values = [[ desiredField]];
valueRange.values = values;
//Inserts value in cell
var result = Sheets.Spreadsheets.Values.update(valueRange, 'XXX-YYY-ZZZ', 'rangeReceivingData', {valueInputOption: 'RAW'});
}
这是传入的 JSON:
{
"responseId": "XXX-YYY-ZZZ",
"queryResult": {
"queryText": "oi",
"action": "input.welcome",
"parameters": {
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Oi!",
"fulfillmentMessages": [{
"text": {
"text": ["Oi!"]
}
}],
"outputContexts": [{
"name": "projects/test-agent-xxyy/agent/sessions/xxx-yyy-zzz/contexts/__system_counters__",
"parameters": {
"no-input": 0.0,
"no-match": 0.0
}
}],
"intent": {
"name": "projects/test-agent-xxyy/agent/intents/xxx-yyy-zzz",
"displayName": "Default Welcome Intent"
},
"intentDetectionConfidence": 1.0,
"languageCode": "pt-br"
},
"originalDetectIntentRequest": {
"source": "slack",
"payload": {
"data": {
"event_time": "1589561467",
"api_app_id": "xxxyyyzzz",
"type": "event_callback",
"event": {
"event_ts": "1589561467.000200",
"team": "xxxyyyzzz",
"blocks": [{
"type": "rich_text",
"block_id": "xxxyyyzzz",
"elements": [{
"elements": [{
"text": "oi",
"type": "text"
}],
"type": "rich_text_section"
}]
}],
"ts": "1589561467.000200",
"channel_type": "im",
"client_msg_id": "xxx-yyy-zzz",
"text": "oi",
"type": "message",
"channel": "xxxyyyzzz",
"user": "T1H2E3G4O5A6L7"
},
"authed_users": ["XXXYYYZZZ"],
"event_id": "xxxyyyzzz",
"token": "xxxyyyzzz",
"team_id": "xxxyyyzzz"
}
}
},
"session": "projects/test-agent-xxyy/agent/sessions/xxx-yyy-zzz"
}
此外,对话流中的履行响应具有这种奇怪的格式:
fields {
key: "action"
value {
string_value: "input.welcome"
}
} ... (this is inside the sheets api error response)
调试时可以查询respondeId 字段(传入 JSON 的第一个字段)。看起来该程序在查询更多字段上花费了大量处理时间,最后它抛出了错误。有什么建议吗?
文档参考:
提前致谢!
【问题讨论】:
-
在你的脚本中,当
the incoming JSON是e.postData.contents,dialogflow.originalDetectIntentRequest.payload.data.event.user是T1H2E3G4O5A6L7。而valueRange是{"values":[["T1H2E3G4O5A6L7"]]}。在这种情况下,我认为不会发生错误。那么你能通过在valueRange.values = values;后面加上Logger.log(valueRange)来确认valueRange的值吗?通过这个,我想检查一下。顺便说一句,在您的脚本中,XXX-YYY-ZZZ和rangeReceivingData分别是电子表格 ID 和工作表名称。我的理解正确吗? -
范围应该是 A1 表示法。
-
@Tanaike 你的理解是对的。
Logger.log(value)只会在通过应用程序脚本编辑器执行时返回一个值,但也许只能通过 webhook 进行测试(在这种情况下),这就是工作表是输出的原因。现在错误消息发生了变化:TypeError: Cannot read property 'event' of undefined。巴西时间已经很晚了,该睡觉了。明天我会继续考虑。任何进展都会在这里报告。ありがとう -
感谢您的回复。当您在 webhook 运行“doPost”时检索值时,将
SpreadsheetApp.openById(logSpreadsheetId).getSheets()[0].appendRow([e.postData.contents, JSON.stringify(valueRange)])放在valueRange.values = values;行之后怎么样?这样,webhook 运行“doPost”,您可以在logSpreadsheetId的电子表格中看到e.postData.contents和valueRange的值。使用这个,你能确认这些值吗?当出现这样的新错误信息并且e.postData.contents是使用key: "action"的值时,需要将"替换为"。
标签: json google-apps-script google-sheets-api chatbot slack-api