Как мне отобразить ответ API на Google Sheet? - PullRequest
0 голосов
/ 16 апреля 2020

Я не очень технический специалист, но я пытался выучить код на JavaScript, так как я остаюсь дома и решил попробовать его на API. Мне удалось успешно выполнить вызов API и сохранить ответ в массиве, но мне было трудно установить результаты на листе Google. Я буду признателен за любую помощь с этим. Вот мой код.

Вызов 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)

 }


 }


}

И здесь у меня возникла проблема с передачей его на страницу Google. Я не получаю ошибки, но не вижу данных, добавляемых на лист.

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": []
            };

1 Ответ

1 голос
/ 17 апреля 2020

Проблема:

Ключевое слово return завершает текущее выполнение функции. Из-за этого из get_All_Projects() возвращается не массив project_arr, а литерал объекта identity со свойствами первого элемента в info.data: функция возвращается во время первой итерации (первой раз он находит ключевое слово return). Этот объект не имеет функции длины, поэтому info.length не определено. При попытке сравнить это с числом 0 в j < info.length, он возвращает false, поэтому код никогда не попадает в for l oop в getSheet(). Из-за этого на лист не записывается значение.

Решение:

Ключевое слово return следует использовать для возврата массива project_arr после for l * 1055. * закончилась, так что в нем есть все данные из 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.data перед объявлением project_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);

Ссылка:

...