【问题标题】:Google Sheets API only returning unecessary informationGoogle Sheets API 仅返回不必要的信息
【发布时间】:2020-05-11 22:31:14
【问题描述】:

目标如下:将 Google 表格数据用作 Dialogflow 中的fulfillmentText。这是当前代码(使用 Google Apps 脚本):

function doPost(e) {
  // This code uses the Sheets Advanced Service, but for most use cases
  // the built-in method SpreadsheetApp.getActiveSpreadsheet()
  //     .getRange(range).getValues(values) is more appropriate.
  var ranges = ['Sheet1!B1'];
  var result = Sheets.Spreadsheets.Values.batchGet('sheetId, {ranges: ranges});
  Logger.log(JSON.parse(result));
  //Transforms the read value from Sheets into JSON format
  return ContentService.createTextOutput(JSON.stringify(result))
            .setMimeType(ContentService.MimeType.JSON);
} 

第一个问题是从电子表格中读取时,不是只获取请求的值,而是输出:

 {valueRanges=[{majorDimension=ROWS, values=[[Content here...]], range=Sheet1!B1}], spreadsheetId=XXXYYYZZZ}

与电子表格相关的信息不是必需的。只需要范围内容。到目前为止,还无法清除输出 JSON 中的电子表格部分。我在文档中没有发现任何关于这个问题的信息。

第二个问题是:return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON)中的内容转换为JSON后,前面的内容被包裹在values字段中:https://developers.google.com/apps-script/guides/content#serving_json_from_scripts

{
  "valueRanges": [
    {
      "range": "Sheet1!B1",
      "majorDimension": "ROWS",
      "values": [
        [
          "Note that we link to certain 3rd party products via affiliate or sponsored links"
        ]
      ]
    }
  ],
  "spreadsheetId": "XXXYYYZZZ"
}

总而言之,第一个问题是仅从 Sheets API 读取内容,而不是:sheetId、range 和 majorDimension... 第二个是发送从 values 字段解包的 JSON 值。这是 Dialogflow 中符合条件的响应格式: https://cloud.google.com/dialogflow/docs/fulfillment-webhook#text_response

提前致谢!!!

【问题讨论】:

    标签: google-apps-script dialogflow-es google-sheets-api chatbot


    【解决方案1】:

    我相信你的目标如下。

    • 您想从以下对象中检索"Note that we link to certain 3rd party products via affiliate or sponsored links" 的内容。并且您想返回 {"values": content} 之类的内容。

      {
        "valueRanges": [
          {
            "range": "Sheet1!B1",
            "majorDimension": "ROWS",
            "values": [
              [
                "Note that we link to certain 3rd party products via affiliate or sponsored links"
              ]
            ]
          }
        ],
        "spreadsheetId": "XXXYYYZZZ"
      }
      

    对于这个,这个答案怎么样?

    修改点:

    • Sheets.Spreadsheets.Values.batchGet 返回解析后的 JSON 对象。所以不需要使用JSON.parse
    • 为了从响应值中检索值,您可以使用result.valueRanges[0].values。另外,当检索到第一个元素时,请使用result.valueRanges[0].values[0][0]

    修改脚本:

    当你的脚本被修改时,请进行如下修改。

    从:
    Logger.log(JSON.parse(result));
    //Transforms the read value from Sheets into JSON format
    return ContentService.createTextOutput(JSON.stringify(result))
              .setMimeType(ContentService.MimeType.JSON);
    
    到:
    var content = result.valueRanges[0].values[0][0];
    var res = {values: content};
    return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
    
    • 如果要检索“值”,请使用result.valueRanges[0].values 而不是result.valueRanges[0].values[0][0]

    注意:

    • 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。请注意这一点。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多