我使用Google Script创建了两个函数,我需要将变量从第一个函数传递给第二个函数。
代码:
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
var urlResponse = UrlFetchApp.fetch(url, options);
}
按下按钮时调用以下功能:
function logResponse(){
Logger.log(urlResponse); //This must return the data from the urlResponse variable
}
答案 0 :(得分:1)
您的两个函数(setVar()
和logVar()
)具有不同的范围,这意味着它们无法访问彼此之间的变量/实体。你想要做的是在这两个之外创建一个变量,这样每个函数都可以访问同一个变量:
var a = 0;
function setVar () {
a = 10;
}
function logVar () {
Logger.log (a);
}
答案 1 :(得分:1)
我想你可能想要完成以下任务:
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
var urlResponse = UrlFetchApp.fetch(url, options);
return urlResponse;
}
function logResponse(){
Logger.log(fetch());
}
所以你可以使用" return"关键字可在其调用时从函数返回值。
然后,您不需要在函数外部声明变量(例如,在全局范围中)。
您只需要调用并将其作为参数传递给您的logResponse()
函数。
所以,请注意以下几点:
return urlResponse;
Logger.log(fetch())
P.S。当然,声明两个函数都可以访问的外部作用域中的变量也可以。 但我上面的解决方案似乎是一个更好的选择。
还有一些建议:
fetch()
重命名为fetchUrl
以更明确。urlResponse
的变量声明也是多余的,你可以这样做: return UrlFetchApp.fetch(url, options);
<强>更新强>
Pavel,看看Jeremy在答案中建议的选项1 。 简而言之,作为建议,您可以将您的代码(取决于您的环境)包装到Immediately-invoked function expression中:
看看下面的例子(注意评论) - &gt;
(function () {
// all the inside of this function is a shared scope for two function below
'use strict';
// this is a declared variable which is accessible for 2nd function
// the value assigned will be the result of calling the 1st function
var urlResponse = fetch();
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass"
};
var options = {
'method' : 'post',
'payload': JSON.stringify(payload)
};
// return the value
return UrlFetchApp.fetch(url, options);
}
function logResponse() {
// use the shared variable (the value of it is a result of calling fetch() function
Logger.log(urlResponse);
}
// then if you want to log your response
// call the function
logResponse();
})();
答案 2 :(得分:0)
一点解释:
当您将上面声明的变量传递给函数时(如示例中所示),将创建一个闭包。函数将访问此变量。
var a = 11;
function setVar() {
a = '777';
}
function logVar(){
Logger.log(a);
}
答案 3 :(得分:0)
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
// This variable ONLY exists inside of the fetch function.
// once this function exits, it is gone.
var urlResponse = UrlFetchApp.fetch(url, options);
}
function logResponse(){
// Nope, this is an entirely SEPARATE variable with the same name.
Logger.log(urlResponse); //This must return the data from the urlResponse variable
}
解决方案:a)将值传递给logResponse()或将var UrlResponse
移动到两个函数可用的外部作用域。不过,保留作业。
选项1
var urlResponse;
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
// This variable ONLY exists inside of the fetch function.
urlResponse = UrlFetchApp.fetch(url, options);
}
function logResponse(){
// Nope, this is an entirely SEPARATE variable with the same name.
Logger.log(urlResponse); //This must return the data from the urlResponse variable
}
选项2
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
// This variable ONLY exists inside of the fetch function.
var urlResponse = UrlFetchApp.fetch(url, options);
logResponse(urlResponse);
}
function logResponse(urlResponse){
Logger.log(urlResponse); //This must return the data from the urlResponse variable
}
答案 4 :(得分:0)
请告诉我这是你的情况:
当您运行脚本(打开文档或在doGet上)时调用函数fetch()
,并从界面上的操作调用第二个logResponse()
(电子表格按钮或google.script。运行....)。
在这种情况下,脚本会运行&#39;两次,两次运行之间的一切都被遗忘了。你能做的是: A /将您从第一个函数获得的值传递给用户界面并返回第二个函数 B /将您在第一个函数中获得的值存储为:
function fetch() {
var endpoint = 'login';
var url = 'https://example.com/api/'+endpoint;
var payload = {
'username' : "user",
'password' : "pass",
}
var options = {
'method' : 'post',
'payload': JSON.stringify(payload),
};
var urlResponse = UrlFetchApp.fetch(url, options);
PropertiesService.getUserProperties().setProperty("urlResp", urlResponse.getContentText());
}
function logResponse(){
var urlResponse = PropertiesService.getUserProperties().getProperty("urlResp");
Logger.log(urlResponse); //This must return the data from the urlResponse variable
}
propertiesService只能存储文本(除了userproperty之外,你可以使用其他东西,比如scriptproperty或documentproperty