javascript - 如何在从 API 响应设置值时避免覆盖谷歌表中的一行
问题描述
我有一个 JavaScript 代码,它从 API 获取响应并在谷歌电子表格上设置值。
我获得的数据是项目中的用户,我需要将其记录到电子表格中的工作表中。
我需要帮助的唯一挑战是避免在后续循环中覆盖现有的工作表数据,我该如何处理?
第一部分获取项目代码并使用它进行 API 调用,其中所有项目的团队都包含在响应中。
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 < range1.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]
};
var options = {
method: 'get',
headers: {
Authorization: 'Bearer ' + AUTH
}
};
var url = tknurlL + Endpoint + data.project_id + '/users?auth=' + AUTH
var response = UrlFetchApp.fetch(url, options);
var team = JSON.parse(response);
var content = team.data;
team_array.push(content);
var ss = SpreadsheetApp.getActive().getSheetByName('Team');
const lr = sheet.getLastRow();
for (var j = 0; j < content.length; j++) {
ss.getRange(2 + j, 1).setValue(content[j].id);
ss.getRange(2 + j, 2).setValue(content[j].first_name);
ss.getRange(2 + j, 3).setValue(content[j].last_name);
ss.getRange(2 + j, 4).setValue(content[j].display_name);
ss.getRange(2 + j, 5).setValue(content[j].email);
ss.getRange(2 + j, 6).setValue(content[j].user_type_id);
ss.getRange(2 + j, 7).setValue(content[j].role);
}
}
}
}
解决方案
这个改装怎么样?
修改点:
- 在您的脚本中,
getRange(2 + j, 1)
每次循环都使用相同的范围作为起始范围。这样,这些值就会被 new 覆盖content
。 - 在此修改中,for 循环
content
被删除,并将值放在 for 循环的外部。检索到的被添加到第一个 for 循环中content
的数组中。contents
这样,所有content
值 (contents
) 都可以放入 by 的工作表Team
中setValues
。而且,可以稍微降低加工成本。
修改后的脚本:
当您的脚本被修改时,请进行如下修改。
从:var team_array = [];
for (var i = 0; i < range1.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]};
var options = {method: 'get',headers: {Authorization: 'Bearer ' + AUTH}};
var url = tknurlL + Endpoint + data.project_id + '/users?auth=' + AUTH
var response = UrlFetchApp.fetch(url, options);
var team = JSON.parse(response);
var content = team.data;
team_array.push(content);
var ss = SpreadsheetApp.getActive().getSheetByName('Team');
const lr = sheet.getLastRow();
for (var j = 0; j < content.length; j++) {
ss.getRange(2 + j, 1).setValue(content[j].id);
ss.getRange(2 + j, 2).setValue(content[j].first_name);
ss.getRange(2 + j, 3).setValue(content[j].last_name);
ss.getRange(2 + j, 4).setValue(content[j].display_name);
ss.getRange(2 + j, 5).setValue(content[j].email);
ss.getRange(2 + j, 6).setValue(content[j].user_type_id);
ss.getRange(2 + j, 7).setValue(content[j].role);
}
}
}
至:
var contents = []; // Added
var team_array = [];
for (var i = 0; i < range1.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]};
var options = {method: 'get',headers: {Authorization: 'Bearer ' + AUTH}};
var url = tknurlL + Endpoint + data.project_id + '/users?auth=' + AUTH
var response = UrlFetchApp.fetch(url, options);
var team = JSON.parse(response);
var content = team.data;
team_array.push(content);
contents = contents.concat(content); // Added
}
}
// I added below script.
if (contents.length > 0) {
var dstSheet = SpreadsheetApp.getActive().getSheetByName('Team');
var values = contents.map(e => ([e.id, e.first_name, e.last_name, e.display_name, e.email, e.user_type_id, e.role]));
dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
参考:
推荐阅读
- firebase - DocumentSnapshot 在颤振中返回 null,同时将其作为类的命名参数传递
- python - 在 Amazon EMR 上运行 Python UDF
- fullcalendar - 1 月至 12 月以外的全日历年视图
- python - 在python中拆分没有空格的数字字符串
- javascript - 使用 .map 进行异步/等待
- angular - ionic 4 / Angular - ion-input - 自定义清除输入按钮
- android - Android:TableLayout 以编程方式用相等的单元格填充整个屏幕
- azure - 如何使用 PowerShell 获取 Azure 资源的对象 ID
- c# - 属性和自定义属性 - 授权如何工作?
- google-bigquery - 气流与 DAG 外部的 BigQuery 交互,而不使用 BigQueryOperators