在应用程序脚本中传递参数
Passing parameters in apps script
基于https://www.plivo.com/blog/Send-templatized-SMS-from-a-Google-spreadsheet-using-Plivo-SMS-API/我有以下代码:
data = {
"SOURCE" : "+1234567890",
"DESTINATION" : "+2345678901",
"FIRST_NAME" : "Jane",
"LAST_NAME" : "Doe",
"COUPON" : "DUMMY20",
"STORE" : "PLIVO",
"DISCOUNT" : "20",
}
template_data = "Hi FIRST_NAME , your coupon code for discount of % purchase at is "
function createMessage(data,template_data){
Logger.log(data);
for (var key in data) {
Logger.log(key);
if (data.hasOwnProperty(key)) {
template_data = template_data.replace(new RegExp('+key+', 'gi'), data[key]);
}
}
Logger.log(template_data);
return template_data;
}
当我 运行 createMessage
并检查我看到的日志时:
[18-10-02 13:19:03:139 EDT] undefined
[18-10-02 13:19:03:139 EDT] undefined
这表明参数没有传递到函数中。我做错了什么?
运行 脚本编辑器中的函数不向函数传递参数。目前,您在项目的全局命名空间中有 3 个用户对象(来自 Google 的其他对象):
createMessage
(函数对象)
template_data
(字符串)
data
(一个对象)。
行 function createMessage(data, template_data)
将对象 createMessage
声明为函数对象,并指示传递给函数的前两个参数在函数范围内是已知的 分别为 data
和 template_data
。这些函数范围参数声明隐藏了任何更远的声明(即来自全局范围或封闭函数范围)。
然后解决方案是编写您实际执行的 "driver function",在其中定义被调用函数的输入参数,或者从函数调用中删除参数:
var data = {...}; // global var
var template_data = {...}; // global var
function driver() {
createMessage(data, template_data); // uses the globally scoped `data` & `template_data` objects
var otherdata = 1,
otherTemplate = 2;
createMessage(otherdata, otherTemplate); // uses the function-scoped `otherdata` and `template_data` objects
}
function createMessage(someData, someTemplate) {
Logger.log(someData);
Logger.log(arguments[0]); // equivalent to the above line.
// ...
}
避免引用阴影:
function createMessage() { // removed `arguments` reference binding
Logger.log(data); // accesses global-scope `data` object because there is no `data` reference in the nearest scope
为了帮助解决这种情况 - 防止通过脚本编辑器手动执行需要参数的函数 - 我通常会通过在名称后添加尾随 _
来使函数私有:function cantBeRunManually_(arg1, arg2, arg3) { ... }
参考文献:
基于https://www.plivo.com/blog/Send-templatized-SMS-from-a-Google-spreadsheet-using-Plivo-SMS-API/我有以下代码:
data = {
"SOURCE" : "+1234567890",
"DESTINATION" : "+2345678901",
"FIRST_NAME" : "Jane",
"LAST_NAME" : "Doe",
"COUPON" : "DUMMY20",
"STORE" : "PLIVO",
"DISCOUNT" : "20",
}
template_data = "Hi FIRST_NAME , your coupon code for discount of % purchase at is "
function createMessage(data,template_data){
Logger.log(data);
for (var key in data) {
Logger.log(key);
if (data.hasOwnProperty(key)) {
template_data = template_data.replace(new RegExp('+key+', 'gi'), data[key]);
}
}
Logger.log(template_data);
return template_data;
}
当我 运行 createMessage
并检查我看到的日志时:
[18-10-02 13:19:03:139 EDT] undefined
[18-10-02 13:19:03:139 EDT] undefined
这表明参数没有传递到函数中。我做错了什么?
运行 脚本编辑器中的函数不向函数传递参数。目前,您在项目的全局命名空间中有 3 个用户对象(来自 Google 的其他对象):
createMessage
(函数对象)template_data
(字符串)data
(一个对象)。
行 function createMessage(data, template_data)
将对象 createMessage
声明为函数对象,并指示传递给函数的前两个参数在函数范围内是已知的 分别为 data
和 template_data
。这些函数范围参数声明隐藏了任何更远的声明(即来自全局范围或封闭函数范围)。
然后解决方案是编写您实际执行的 "driver function",在其中定义被调用函数的输入参数,或者从函数调用中删除参数:
var data = {...}; // global var
var template_data = {...}; // global var
function driver() {
createMessage(data, template_data); // uses the globally scoped `data` & `template_data` objects
var otherdata = 1,
otherTemplate = 2;
createMessage(otherdata, otherTemplate); // uses the function-scoped `otherdata` and `template_data` objects
}
function createMessage(someData, someTemplate) {
Logger.log(someData);
Logger.log(arguments[0]); // equivalent to the above line.
// ...
}
避免引用阴影:
function createMessage() { // removed `arguments` reference binding
Logger.log(data); // accesses global-scope `data` object because there is no `data` reference in the nearest scope
为了帮助解决这种情况 - 防止通过脚本编辑器手动执行需要参数的函数 - 我通常会通过在名称后添加尾随 _
来使函数私有:function cantBeRunManually_(arg1, arg2, arg3) { ... }
参考文献: