Передача массивов в качестве параметра URL JavaScript / GAS - PullRequest
0 голосов
/ 04 марта 2020

У меня есть две функции.

Один запрашивает идентификатор проекта, имя проекта и статус проекта и сохраняет их в массиве. Это отлично работает.

function get_All_Projects() {
    var options = {
        method: "get",
        headers: {
            Authorization: "Bearer " + tkft_token
        }
    };
    var url = tkft_url + endpoint + "auth=" + tkft_token + pages;
    var response = UrlFetchApp.fetch(url, options);
    var info = JSON.parse(response);
    var content = info.data;    
    var project_arr = [];
    var identity = {};  
    for (var i = 0; i < content.length; i++) {
        if (content.length > 0) {
            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);
        }
    }
    //Logger.log(project_arr);
}

Вторая функция должна использовать сохраненный идентификатор в project_arr, чтобы я мог получить всех пользователей на проект. Проблема в том, что мне трудно включить один из объектов массива в URL для этой функции, а также перебирать каждый идентификатор проекта. Я продолжаю сталкиваться с Не могу прочитать свойство 'length' с неопределенной ошибкой. Что-то мне не хватает?

function get_By_Users(project_arr) {
    var options = {
        method: 'get',
        headers: {
            Authorization: 'Bearer ' + tkft_token
        }
    };

    for (var i = 0; i<project_arr.length; i++) {  
        var url = tkft_url+ 'projects/'+ project_arr.Project_ID +'/users?auth='+ tkft_token + pages
        var response = UrlFetchApp.fetch(url,options); 
        var info= JSON.parse(response); 
        var content = info.data;
    }

    Logger.log(content);
}

1 Ответ

3 голосов
/ 04 марта 2020

Я удивлен, что этот код работает без обещаний или асинхронных c, если он действительно выполняет выборку URL. Или это макет?

В любом случае, вместо al oop и Array.pu sh, вы можете просто использовать Array.map для преобразования данных.

Кроме того, вы можно использовать шаблонную строку вместо конкатенации строк.

function get_All_Projects() {
    const options = {
        method: "get",
        headers: {
            Authorization: "Bearer " + tkft_token
        }
    };
    const url = `${tkft_url}${endpoint}auth=${tkft_token}${pages}`
    const response = UrlFetchApp.fetch(url, options);
    const info = JSON.parse(response);
    const content = info.data;    
    const project_arr = content.map(item => ({
        Project_ID: item.id;
        Project_Name: item.name;
        Project_Start_Date: item.starts_at;
        Project_End_Date: item.ends_at;
        Project_Status: item.project_state; 
    }))
    return project_arr
}

Затем вам нужно вызвать get_By_Users с помощью project_arr:

const allProjects = get_All_Projects()
get_By_Users(allProjects)

. Array.map.

async function get_By_Users(project_arr) {
    var options = {
        method: 'get',
        headers: {
            Authorization: 'Bearer ' + tkft_token
        }
    };

   const makeUrl = p => `${tkft_url}projects/${p.Project_ID}/users?auth=${tkft_token}${pages}`

  const safeJSONparse = item => {
    try {
      return JSON.parse(item)
    } catch (e) {
      return {data: undefined}
    }
  }

  const data = project_arr.map(p =>
     safeJSONparse(UrlFetchApp.fetch(makeUrl(p), options)).data))

    Logger.log(data);
}

Вы всегда должны пытаться / ловить с JSON .parse, потому что он выбрасывает, если не может проанализировать ввод. Затем вам нужно решить, как ваше приложение будет вести себя, когда это произойдет. 20% кодирования заставляют его работать. Остальные 80% - это кодирование того, что происходит, когда это не работает.

См. эту статью , для чего нужно использовать Array.map, и этот , почему использовать const.

...