【问题标题】:Passing arrays as URL parameter JavaScript/GAS将数组作为 URL 参数 JavaScript/GAS 传递
【发布时间】:2020-03-04 13:18:23
【问题描述】:

我有两个功能。

一个查询项目ID、项目名称和项目状态并将它们保存在一个数组中。这工作正常。

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

【问题讨论】:

  • 你怎么打电话给get_By_Users()
  • @TheMaster,不确定我是否理解您的问题,但要呼吁所有用户,这是 URL 结构 /api/v1/projects//users 基本上,我应该从 get_All_Projects() 函数中的 *project_arr 获取 project_id 并在第二个函数的 URL 中使用它
  • 如果您在 get_All_Projects() 函数之外调用 get_By_Users()project_arr 未定义,因为它是本地变量。
  • 阅读this并解释你是如何调用这个函数的。
  • 即使你得到了答案,这是基本的东西,如果你阅读并练习上面的基本功能链接,它会对你有好处。

标签: javascript arrays google-apps-script javascript-objects urlfetch


【解决方案1】:

我很惊讶这段代码在没有 Promises 或异步的情况下工作,如果它真的做了一个 URL 提取。还是那是一个模拟?

无论如何,您可以使用 Array.map 来进行数据转换,而不是循环和 Array.push。

此外,您可以使用模板字符串,而不是字符串连接。

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 了解为什么要使用 Array.map,请参阅this one 了解为什么要使用 const

【讨论】:

  • 我很惊讶这段代码可以在没有 Promises 或异步的情况下工作,如果它真的进行了 URL 获取。 请参阅标签 urlfetch 信息页面
  • 有趣 - 我以前从未见过。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多