首页 > 解决方案 > 如何将 API 响应映射到 Google 表格

问题描述

我不是一个真正的技术人员,但我一直在尝试学习 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": []
            };

标签: javascriptarraysgoogle-apps-scriptgoogle-sheetsjavascript-objects

解决方案


问题:

return关键字结束当前函数执行。因此,返回get_All_Projects()的不是数组project_arr,而是对象字面identity量,其中第一个元素的属性是info.data:函数在第一次迭代时返回(第一次找到return关键字时)。这个对象没有长度函数,所以info.length是未定义的。当尝试将此与 中的数字 0 进行比较时j < info.length,它返回 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.dataproject_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);

参考:


推荐阅读