【问题标题】:Adding rows with smartsheet API in Google Apps Script在 Google Apps 脚本中使用 smartsheet API 添加行
【发布时间】:2023-04-07 22:19:01
【问题描述】:

我遇到了与 user:itsallgood in this link 相同的问题--当我提交以下添加行的请求时,我收到以下错误。

{"errorCode":1008,"message":"无法解析请求。出现以下错误:请求正文必须是 JSON 对象或 JSON 数组。"}

我相信数据格式正确,并且我已在jsonformatter.curiousconcept.com 验证它是有效的 JSON。

var params = {  
   "headers":{  
      "authorization":"Bearer <<removed for public posting>>"
   },
   "contentType":"application/json",
   "method":"PUT",
   "body":[  
      {  
         "toBottom":true,
         "cells":[  
            {  
               "columnId":4209581015492484,
               "value":"New row"
            }
         ]
      }
   ]
}
var response = UrlFetchApp.fetch("https://api.smartsheet.com/2.0/sheets/<<sheet key removed>>/rows", params)

向 itsallgood 提供的答案是,问题是由于 API 1.1 端点存在错误,而 2.0 将解决它。但是,我使用的是 API 2.0 端点,但仍然出现错误。

如果有人能帮助解决这个谜题,我将不胜感激!

【问题讨论】:

    标签: json google-apps-script smartsheet-api


    【解决方案1】:

    使用PostmanChrome Advanced Rest ClientcUrl 等交互式工具进行测试要容易得多。我不确定您的脚本实际上是通过网络发送什么。

    几个观察

    UrlFetch docs 示例包括从 JS 对象到 JSON 字符串的显式转换:

    var data = { ... }
    
    var params = {
        'method' : 'post',
        'contentType': 'application/json',
        // Convert the JavaScript object to a JSON string.
        'payload' : JSON.stringify(data)
    };
    

    另请注意,当您设置 params.body 时,样本集 params.payload

    另外,PUT /sheets/{sheetId}/rows 用于更新一个或多个现有行。因此,有效负载中的每个行对象都需要一个行 ID。请参阅docs 中的示例。
    或者,您可以POST 一个新行。

    【讨论】:

    • 感谢史蒂夫的评论!我采纳了您使用 Chrome ARC 的建议,结果证明这篇文章应该有效——所以感谢您向我介绍 ARC。我实际上正在尝试发布一个新行,并且在以前的尝试中使用了该方法而没有成功。现在使用 POST,Google Apps 脚本中的请求仍然失败,并出现同样的错误。此外,GAS 解释器在使用 JSON.stringify(params) 时会给出“错误值”错误。最后,我使用 params.body 而不是 params.payload 的原因是有效负载在运行时会出现以下错误:{“属性提供的值无效:有效负载”}。有人有想法吗?
    【解决方案2】:

    这是一个完整的例子:

    function addRow(){
    var url ="https://api.smartsheet.com/2.0/sheets/5670346721388420/rows";
    
    var data ={
            "toBottom": true,
            "cells": [
                {
                    "value": "New data",
                    "columnId": 5759377954105220
                }
            ]
        };
    
    var options ={
            "headers": {
                "authorization": "Bearer ll352u9jujauoqz4fstvsae05"
            },
            "method": "post",
            "contentType": "application/json",
            "payload": JSON.stringify(data)
        };
    Logger.log("About to call: " + url);
    
    var response = UrlFetchApp.fetch(url, options);
    
    Logger.log("Response: " + response);
    }
    

    【讨论】:

    • 谢谢你,史蒂夫!调整我的代码以将 JSON.stringify() 应用于有效负载元素,而不是像您在此处所做的那样工作的整个 JSON 请求。为什么完整的请求参数(我的示例中的“params”变量)在被字符串化后未能被识别为有效的 JSON,这让我感到困惑,但我希望我的困惑是缺乏经验的产物。无论如何,再次感谢您提供解决方案!
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2014-08-25
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多