Как пропустить oop через все ответы от API и передать их в Google Sheet, используя Javascript? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть этот код, который получает идентификатор проекта из таблицы Google, если они соответствуют критериям (между двумя датами), и использует его для 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 function. Где я получаю пользователей только для одного проекта, а не для всех 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);

    }

}

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы возвращаете только первый результат в функции readDates. Ваша инструкция возврата находится внутри l oop, вам нужно где-то агрегировать все результаты, вы можете использовать массив перед выполнением возврата.

var contents = [];
for (var i = 0; i < range.length; i++) {
     ...
     contents.push(content);
     } //close if2
   } //close if1
}//close for
return contents;
1 голос
/ 06 мая 2020

Оператор return завершает выполнение функции и выходит из нее

  • Вы используете return(content) внутри for l oop
  • Как следствие, функция будет завершена после первой итерации
  • Вместо этого вы должны создать массив, в который вы добавляете в каждой итерации данные для каждого проекта
  • Возвращать массив, содержащий все данные после выход из for l oop.

Пример:

  ...
  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) {
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...