提前为这个冗长的问题道歉。我正在尝试创建一个 Google 表格,告诉我每个承包商每个月登录 Clockify 的小时数。(完整代码在底部)
简而言之,我的问题是使用来自谷歌表的输入为对 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 表格中计算的变量,因为我需要每个月更改这些日期。我写了一个函数,它给了我正确的输出(“2022-01-01T00:00:00.000”,“2022-01-31T23:59:59.000”),但是当我引用谷歌表格中的单元格时,我得到一个 400错误提示 API 无法解析 JSON。
脚本中的功能:
function GetHours(userName, startDate, endDate) {
var newJSON = {
"dateRangeStart": startDate,
"dateRangeEnd": endDate,
"summaryFilter": {
"groups": ["USER"],
"sortColumn": "GROUP"
}
}
var payload = JSON.stringify (newJSON);
...}
在工作表中调用函数:
=GetHours(C3,$D$45,$D$46)
输出错误信息:
例外:对https://reports.api.clockify.me的请求失败,返回代码 400。截断的服务器响应:{"code":400,"message":"generateSummaryReport.arg1.dateRangeEnd: 字段 dateRangeEnd 是必需的,generateSummaryReport.arg1 .dateRangeStart: Field da...(使用 muteHttpExceptions 选项检查完整响应)
当我使用 Logger.log(payload) 时发生了一件奇怪的事情,这可能是问题的根源。看起来代码运行了两次,第一次有效载荷 JSON 是正确的,但第二次是不正确的。
第一次: {"dateRangeStart":"2022-01-01T00:00:00.000","dateRangeEnd":"2022-01-31T23:59:59.000","summaryFilter":{"groups":["USER"] ,"sortColumn":"GROUP"}}
第二次: {"summaryFilter":{"groups":["USER"],"sortColumn":"GROUP"}}
我尝试了很多解决方案,但实际上归结为在 JSON 中引用 Google 工作表。当我将日期计算的输出复制并粘贴到 JSON 中时,它可以工作。当我使用日期计算输出在脚本中创建变量时,它可以工作。当我返回 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();