Как избежать перезаписи строки в листе Google при установке значений из ответа API - PullRequest
1 голос
/ 07 мая 2020

У меня есть код JavaScript, который получает ответ от API и устанавливает значения в электронной таблице Google.

Данные, которые я получаю, являются пользователями проекта, которые мне нужно записать на лист в электронной таблице.

Единственная проблема, в которой мне нужна помощь, - это избежать перезаписи существующих данных листа при последующих l oop, как я могу с этим справиться?

Эта первая часть получает коды проекта и использует их для вызова 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);

        }

       }
    }
   }

1 Ответ

2 голосов
/ 07 мая 2020

Как насчет этой модификации?

Точки модификации:

  • В вашем скрипте один и тот же диапазон getRange(2 + j, 1) используется в качестве начального диапазона каждый раз в l oop. При этом значения перезаписываются новым content.
  • В этой модификации для l oop для content удаляется и помещаются значения вне для l oop. Полученный content добавляется к массиву contents в 1-м для l oop. Таким образом, все значения content (contents) могут быть помещены в лист 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);
}

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...