我并不是真正的技术人员,但我呆在家里一直在尝试学习 JavaScript 代码,并决定在 API 上尝试一下。我已经能够成功进行 API 调用并将响应保存在数组中,但发现将结果设置到谷歌表是一个挑战。我将不胜感激任何帮助。这是我的代码。
API 调用:
var call_token = 'token';
var endpoint = 'projects?';
var call_url = 'url'
var pages = 2500
function get_All_Projects() {
var options = {
method: 'get',
headers: {
Authorization: 'Bearer ' + call_token
}
};
var url = call_url + endpoint +'auth='+ call_token + pages
var response = UrlFetchApp.fetch(url,options);
var info= JSON.parse(response);
var content = info.data;
var project_arr=[];
var identity={}
if(content.length > 0 ){
for (var i = 0; i<content.length; i++) {
identity.Project_ID=content[i].id
identity.Project_Name=content[i].name
identity.Project_Start_Date=content[i].starts_at
identity.Project_End_Date=content[i].ends_at
identity.Project_Status=content[i].project_state
project_arr.push(identity)
return (identity);
Logger.log(project_arr)
}
}
}
这就是我在将其传递到谷歌表格时遇到的挑战。我没有收到任何错误,但我没有看到数据附加到工作表中。
function getSheet() {
var info = get_All_Projects()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
for (var j = 0; j < info.length; j++) {
sheet.getRange(2 + j, 1).setValue(info[j].Project_Status);
sheet.getRange(2 + j, 2).setValue(info[j].Project_End_Date);
sheet.getRange(2 + j, 3).setValue(info[j].Project_Start_Date);
sheet.getRange(2 + j, 4).setValue(info[j].Project_ID);
sheet.getRange(2 + j, 5).setValue(info[j].Project_Name);
}
}
postman 的响应示例
"data": [
{
"id": 1800301,
"name": "TEST Project ONE",
"ends_at": "2020-06-30",
"starts_at": "2017-07-03",
"project_state": "Confirmed",
"tags": {
"paging": {
"self": "/api/v1/projects/1894300/tags?per_page=0&page=1",
"next": null,
"previous": null,
"page": 1,
"per_page": 0
},
"data": []
}
},
{
"id": 1800301,
"name": "TEST Project4 TWO",
"ends_at": "2020-06-30",
"starts_at": "2017-07-03",
"project_state": "Confirmed",
"tags": {
"paging": {
"self": "/api/v1/projects/1894301/tags?per_page=0& page=1",
"next": null,
"previous": null,
"page": 1,
"per_page": 0
},
"data": []
};
最佳答案
问题:
return
关键字结束当前函数的执行。因此,从 get_All_Projects()
返回的是什么?不是数组 project_arr
,但是对象字面量 identity
,具有 info.data
中第一个元素的属性:函数在第一次迭代中返回(第一次找到 return
关键字)。该对象没有长度函数,因此 info.length
未定义。当尝试将其与 j < info.length
中的数字 0 进行比较时,它返回 false,因此代码永远不会进入 for
循环输入getSheet()
。因此,没有值被写入工作表。
解决方案:
return
应该使用关键字返回数组 project_arr
for
之后循环已结束,因此它具有来自 info.data
的所有数据,像这样:
for (var i = 0; i<content.length; i++) {
// Code inside for
}
return project_arr
删除无用代码:
现在,您正在使用 project_arr
创建一个新数组 ( info.data
)基本上具有相同的信息。为此,您需要迭代 info.data
中的所有项目。并将元素插入project_arr
,一一。这样做没有意义。您可以使用 info.data
直接这样做:
- 结束函数
get_All_Projects()
通过返回info.data
在声明project_arr
之前:
return info.data;
- 在
getSheet()
,更改属性以写入工作表:
sheet.getRange(2 + j, 1).setValue(info[j].project_state);
sheet.getRange(2 + j, 2).setValue(info[j].ends_at);
sheet.getRange(2 + j, 3).setValue(info[j].starts_at);
sheet.getRange(2 + j, 4).setValue(info[j].id);
sheet.getRange(2 + j, 5).setValue(info[j].name);
引用:
关于javascript - 如何将 API 响应映射到 Google Sheet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255201/