在 Google 脚本中为 fetchURL 编写请求 JSON:脚本运行两次?

Writing a request JSON for fetchURL in Google Scripts: Script runs twice?

对于这么长的问题提前致歉。我正在尝试创建一个 Google Sheet 来告诉我每个承包商每个月登录 Clockify 的小时数。 (完整代码在底部)

简而言之,我的问题是使用来自 google sheet 的输入为 Clockify API 的 UrlFetchApp.fetch() 请求创建一个 JSON 文件.

我希望 JSON 看起来像这样:

var newJSON = {
        "dateRangeStart": "2022-01-01T00:00:00.000",
        "dateRangeEnd": "2022-01-31T23:59:59.000",
        "summaryFilter": {
          "groups": ["USER"],
          "sortColumn": "GROUP"
        }
      }
var payload = JSON.stringify (newJSON);

当我使用这段代码时,它运行良好。但是,开始日期和结束日期是我在 google sheet 中计算的变量,因为我需要这些日期每月更改一次。我写了一个能给我正确输出的函数(“2022-01-01T00:00:00.000”、“2022-01-31T23:59:59.000”),但是当我引用 google sheets,我收到一个 400 错误,指出 API 无法解析 JSON.

脚本中的函数:

function GetHours(userName, startDate, endDate) {

  var newJSON = {
        "dateRangeStart": startDate,
        "dateRangeEnd": endDate,
        "summaryFilter": {
          "groups": ["USER"],
          "sortColumn": "GROUP"
        }
      }

  var payload = JSON.stringify (newJSON); 
...}

在 sheets 中调用函数:

=GetHours(C3,$D,$D)

输出错误信息:

异常:https://reports.api.clockify.me returned 代码 400 的请求失败。截断的服务器响应:{"code":400,"message":"generateSummaryReport.arg1.dateRangeEnd: Field dateRangeEnd是必需的,generateSummaryReport。arg1.dateRangeStart:字段 da...(使用 muteHttpExceptions 选项检查完整响应)

当我使用Logger.log(payload)时出现了奇怪的事情,这可能是问题的根源。看起来代码运行了两次,并且有效载荷第一次 JSON 正确,但第二次不正确。

第一次: {"dateRangeStart":"2022-01-01T00:00:00.000","dateRangeEnd":"2022-01-31T23:59:59.000","summaryFilter":{"groups":["USER"],"sortColumn ":"组"}}

第二次: {"summaryFilter":{"groups":["USER"],"sortColumn":"GROUP"}}

我尝试了很多解决方案,但实际上归结为在 JSON 中引用 Google sheet。当我将日期计算的输出复制并粘贴到 JSON 时,它起作用了。当我在脚本中使用日期计算输出创建变量时,它起作用了。当我 return startDate 时,它​​给了我“2022-01-01T00:00:00.000”,这是正确的。我只是不明白出了什么问题。感谢您的帮助!

完整代码:

const APIbase = "https://api.clockify.me/api/v1"
const APIreportsbase = "https://reports.api.clockify.me/v1"
const myAPIkey =  "[HIDDEN FOR PRIVACY]"
const myWorkspaceID = "[HIDDEN FOR PRIVACY]"

function GetHours(userName, startDate, endDate) {

  var newJSON = {
        "dateRangeStart": startDate,
        "dateRangeEnd": endDate,
        "summaryFilter": {
          "groups": [
            "USER"
          ],
          "sortColumn": "GROUP"
        }
      }

var payload = JSON.stringify (newJSON);
  var headers = {"X-Api-Key" : myAPIkey, "content-type" : "application/json"};
  var url = APIreportsbase + '/workspaces/' + myWorkspaceID + '/reports/summary'

  var options = {
    "method": "post",
    "contentType": "application/json",
    "headers": headers,
    "payload": payload,
    "muteHttpExceptions" : false
  };


  var response = UrlFetchApp.fetch(url, options)
  var json = response.getContentText();
  var data = JSON.parse(json);
  var people = data.groupOne;


  for (let i = 0; i < people.length; i++) {

    if (people[i].name == userName) {

      if (people[i].duration == 0) {
        return 0;
      } else {
        return people[i].duration/3600;
      }
   } 
  }
}

GetHours();

我通过添加过滤器让程序正常工作,这样程序第二次 运行 就不会影响 return 值。

if (startDate != null) {
  var response = UrlFetchApp.fetch(url, options)
  var json = response.getContentText();
  .....
}