【问题标题】:Google Apps Script - GoogleJsonResponseException: API call to sheets.spreadsheets.values.update failed with error: Invalid values[1][0]Google Apps 脚本 - GoogleJsonResponseException:对 sheet.spreadsheets.values.update 的 API 调用失败并出现错误:无效值[1][0]
【发布时间】: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 JSONe.postData.contentsdialogflow.originalDetectIntentRequest.payload.data.event.userT1H2E3G4O5A6L7。而valueRange{"values":[["T1H2E3G4O5A6L7"]]}。在这种情况下,我认为不会发生错误。那么你能通过在valueRange.values = values; 后面加上Logger.log(valueRange) 来确认valueRange 的值吗?通过这个,我想检查一下。顺便说一句,在您的脚本中,XXX-YYY-ZZZrangeReceivingData 分别是电子表格 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.contentsvalueRange 的值。使用这个,你能确认这些值吗?当出现这样的新错误信息并且e.postData.contents是使用key: "action"的值时,需要将"替换为"

标签: json google-apps-script google-sheets-api chatbot slack-api


【解决方案1】:

错误,已解决。首先,要点: 可以使用JSON.stringify从webhook中恢复收到的JSON

function doPost(e) {
  //Parse incoming JSON from Dialogflow
  var dialogflow = JSON.parse(e.postData.contents);

  //Stringify webhook after parsing
  var desiredField = JSON.stringify(dialogflow);

  //Outputs value in sheet
  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, 'spreadSheetId', 'range', 
     {valueInputOption: 'RAW'});
}

传入的JSON 符合预期,然后只需查询所需字段即可:

从此:

  //Stringify webhook after parsing
  var desiredField = JSON.stringify(dialogflow);

对此:

 //Extracts userId from Slack
 var desiredField = dialogflow.originalDetectIntentRequest.payload.data.event.user;

错误已解决!

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多