在 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();
.....
}
对于这么长的问题提前致歉。我正在尝试创建一个 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();
.....
}