将数组作为 URL 参数传递 JavaScript/GAS

Passing arrays as URL parameter JavaScript/GAS

我有两个功能。

查询项目 ID、项目名称和项目状态并将它们保存在 array.This 中工作正常。

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 中的 Id,这样我就可以获取每个项目的所有用户。挑战是,我很难在 URL 中包含此函数的数组对象之一,并且还循环遍历每个项目 ID。我将 运行 保留为 Cannot read 属性 'length' of undefined 错误,我是否遗漏了什么?

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);
}

令我惊讶的是,如果此代码确实进行了 URL 提取,则它可以在没有 Promises 或异步的情况下工作。或者这是一个模拟?

无论如何,除了循环和 Array.push,您可以只使用 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
}

然后你需要用 project_arr:

调用 get_By_Users
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% 的人正在为它不起作用时发生的事情编写代码。

请参阅 this article for why to use Array.map, and this one 了解为什么要使用 const