将数组作为 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
。
我有两个功能。
查询项目 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
。