如何循环API的所有响应,并使用Javascript将它们传递到Google Sheet



我有这样的代码,如果项目符合条件(在两个日期之间(,它会从google工作表中获取项目ID,并将其用于API以获取项目中的用户。之后,getTeam函数将响应(Team(附加到工作表中。我面临的挑战是,我无法在getTeam函数中将所有用户附加到工作表中。我在readDates中没有很好地构建循环。我将帮助构建代码,让所有用户都能进入工作表。

function readDates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range1 = sheet.getRange("C2:C" + sheet.getLastRow()).getValues();
var searchString = "Project";
var ahead = nextweek()
var behind = lastweek()
var team_array = [];
for (var i = 0; i < range.length; i++) {
if (range1[i][0] >= behind && range1[i][0] <= ahead) {

var lastRow = sheet.getRange(2 + i, 1, 1, 8).getValues();
var dateval = lastRow[0][2]
var data = {
'project_id': lastRow[0][3] // There are 6 projects ID meeting criteria, each project has 7 users
};

var options = {
method: 'get',
headers: {
Authorization: 'Bearer ' + token
}
};
var url = tknurl + Endpoint + data.project_id + '/users?auth=' + token
var response = UrlFetchApp.fetch(url, options);
var team = JSON.parse(response);
var content = team.data;
team_array.push(content);
}
}
return(content) 
}

getTeam函数。我只得到一个项目的用户,而不是所有6个项目

function getTeam() {
var ss = SpreadsheetApp.getActive().getSheetByName('Team');
var Pro_data = readDates()
for (var j = 0; j < Pro_data.length; j++) {
ss.getRange(2 + j, 1).setValue(Pro_data[j].id);
ss.getRange(2 + j, 2).setValue(Pro_data[j].first_name);
ss.getRange(2 + j, 3).setValue(Pro_data[j].last_name);
ss.getRange(2 + j, 4).setValue(Pro_data[j].display_name);
ss.getRange(2 + j, 5).setValue(Pro_data[j].email);
ss.getRange(2 + j, 6).setValue(Pro_data[j].user_type_id);
ss.getRange(2 + j, 7).setValue(Pro_data[j].role);
}
}
return语句完成函数的执行并退出
  • for循环中使用return(content)
  • 因此,函数将在第一次迭代后退出
  • 相反,您应该创建一个数组,在每次迭代中将每个项目的数据附加到该数组中
  • 返回退出for循环后包含所有数据的数组

样本:

...
var myArray = [];
for (var i = 0; i < range1.length; i++) {
...
var content = team.data;
myArray.push(content);
...    
}
return content; 
...

旁注:

您可以替换嵌套的if语句

if (range1[i][0] >= behind) {
if (range1[i][0] <= ahead) {
...
}
}

通过一个组合:

if (range1[i][0] >= behind && range1[i][0] <= ahead) {
...
}

您只返回readDates函数中的第一个结果。您的返回指令在循环中,您需要在某个地方聚合所有结果,您可以在执行返回之前使用数组。

var contents = [];
for (var i = 0; i < range.length; i++) {
...
contents.push(content);
} //close if2
} //close if1
}//close for
return contents;

最新更新