Google apps script 我是否可以连接来自某个源代码的一段代码,并使用Google应用程序脚本执行它?
Google apps script 我是否可以连接来自某个源代码的一段代码,并使用Google应用程序脚本执行它?,google-apps-script,Google Apps Script,var ss=SpreadsheetApp.getActive(); var sourceSheet=ss.getSheetByName('Source'); var sourceValue=sourceSheet.getDataRange().getValues(); var source=sourceValue[0][0]; Logger.log(源代码); FUNC_CONTENT_TO_INJECT=源; 函数main(){ var a,functionContent,objectOfD
var ss=SpreadsheetApp.getActive();
var sourceSheet=ss.getSheetByName('Source');
var sourceValue=sourceSheet.getDataRange().getValues();
var source=sourceValue[0][0];
Logger.log(源代码);
FUNC_CONTENT_TO_INJECT=源;
函数main(){
var a,functionContent,objectOfData,x;
functionContent=“new”+FUNC\u CONTENT\u TO\u INJECT;
objectOfData={};//创建新的空对象
a=“测试值”;
x=“你好,世界”;
objectOfData[“a”]=a;//向对象添加一个键/值对
objectOfData[“x”]=x;
新函数(“o”,functionContent).call(“,objectOfData);
};代码>可以在应用程序脚本项目之外使用函数内容,并将其插入到应用程序脚本代码中。可以检索函数内容,使用该函数内容创建一个新函数,然后新函数在完成后运行,不留下任何代码痕迹。您可以使用以下代码向自己证明:
var FUNC_CONTENT_TO_INJECT;//Define a global variable without assigning a value
//Assign a value to the global variable
FUNC_CONTENT_TO_INJECT = "function injectedFunction() {Logger.log('x: ' + x);" +
"Logger.log('a: ' + a)}";
function main() {
var a,x,functionContent;
functionContent = "new " + FUNC_CONTENT_TO_INJECT;
a = "Test Value";
x = "Hello World";
new Function("a,x", functionContent).call("",a,x);
};
通过使用“new”关键字,可以创建一个临时函数,然后使用call()
在上面的示例中,我在call()
方法中输入了一个空字符串作为第一个参数。第一个参数的处理方式与所有后续参数的处理方式不同。第一个参数之后的所有后续参数都被视为单个变量。第一个参数是thisArg
,它与this
关键字和范围相关
function.call(thisArg,value1, value2,etc)
同样在上面的例子中,我使用了一个全局变量来模拟您将从电子表格中获得的函数内容
我建议添加一些条件测试,以确定传入的函数内容是否来自您。来自任何源的任何函数内容都可以被注入,只要代码可以作为有效代码处理,代码就可以运行。因为您的main()
函数没有接收任何输入参数,并且函数内容来自您拥有的具有特定ID的电子表格,所以我不知道有人会如何将其他函数内容注入代码中。但是,采取一些简单的预防措施不会有什么坏处。您需要更加担心的情况是,从Web应用程序调用服务器函数,数据可以从客户端浏览器发送到该函数
var FUNC_CONTENT_TO_INJECT;
FUNC_CONTENT_TO_INJECT = "function injectedFunction() {Logger.log(o);" +
"Logger.log('typeof o: ' + typeof o);" +
"Logger.log('x: ' + o.x);" +
"Logger.log('a: ' + o.a)}";
function main() {
var a,functionContent,objectOfData,x;
functionContent = "new " + FUNC_CONTENT_TO_INJECT;
objectOfData = {};//Create new empty object
a = "Test Value";
x = "Hello World";
objectOfData["a"] = a;//Add a key / value pair to the object
objectOfData["x"] = x;
new Function("o", functionContent).call("",objectOfData);
};
可以在应用程序脚本项目之外使用函数内容,并将其插入到应用程序脚本代码中。可以检索函数内容,使用该函数内容创建一个新函数,然后新函数在完成后运行,不留下任何代码痕迹。您可以使用以下代码向自己证明:
var FUNC_CONTENT_TO_INJECT;//Define a global variable without assigning a value
//Assign a value to the global variable
FUNC_CONTENT_TO_INJECT = "function injectedFunction() {Logger.log('x: ' + x);" +
"Logger.log('a: ' + a)}";
function main() {
var a,x,functionContent;
functionContent = "new " + FUNC_CONTENT_TO_INJECT;
a = "Test Value";
x = "Hello World";
new Function("a,x", functionContent).call("",a,x);
};
通过使用“new”关键字,可以创建一个临时函数,然后使用call()
在上面的示例中,我在call()
方法中输入了一个空字符串作为第一个参数。第一个参数的处理方式与所有后续参数的处理方式不同。第一个参数之后的所有后续参数都被视为单个变量。第一个参数是thisArg
,它与this
关键字和范围相关
function.call(thisArg,value1, value2,etc)
同样在上面的例子中,我使用了一个全局变量来模拟您将从电子表格中获得的函数内容
我建议添加一些条件测试,以确定传入的函数内容是否来自您。来自任何源的任何函数内容都可以被注入,只要代码可以作为有效代码处理,代码就可以运行。因为您的main()
函数没有接收任何输入参数,并且函数内容来自您拥有的具有特定ID的电子表格,所以我不知道有人会如何将其他函数内容注入代码中。但是,采取一些简单的预防措施不会有什么坏处。您需要更加担心的情况是,从Web应用程序调用服务器函数,数据可以从客户端浏览器发送到该函数
var FUNC_CONTENT_TO_INJECT;
FUNC_CONTENT_TO_INJECT = "function injectedFunction() {Logger.log(o);" +
"Logger.log('typeof o: ' + typeof o);" +
"Logger.log('x: ' + o.x);" +
"Logger.log('a: ' + o.a)}";
function main() {
var a,functionContent,objectOfData,x;
functionContent = "new " + FUNC_CONTENT_TO_INJECT;
objectOfData = {};//Create new empty object
a = "Test Value";
x = "Hello World";
objectOfData["a"] = a;//Add a key / value pair to the object
objectOfData["x"] = x;
new Function("o", functionContent).call("",objectOfData);
};
谢谢。如果我的函数比处理两个变量要复杂一点呢?我试着根据我的需要调整这个想法,但它似乎不起作用。你可以创建一个变量对象,这样你就只有一个参数,所有的数据都在一个对象内。然后,对象中将包含任意数量的变量。JSON对象->{“key1”:“value1”,“key2”:“value2”,等等}
请参阅底部带有新代码的更新答案。因此,当我将函数作为全局变量键入时,它会起作用,但当我尝试从变量读取函数时,会出现错误,即函数是字符串。。知道为什么吗?我能解决这个问题吗?如果你能创建一个相对简单的例子来产生错误,我可以尝试重现它。另外,如果您可以使用Logger.Log('variableName:'+variableName)
将变量值打印到日志中,然后发布有帮助的结果。此外,new
关键字使用了两次。在我的示例中,单词“new”连接到字符串的前面。非常感谢。如果我的函数比处理两个变量要复杂一点呢?我试着根据我的需要调整这个想法,但它似乎不起作用。你可以创建一个变量对象,这样你就只有一个参数,所有的数据都在一个对象内。然后,对象中将包含任意数量的变量。JSON对象->{“key1”:“value1”,“key2”:“value2”,等等}
请参阅底部带有新代码的更新答案。因此,当我将函数作为全局变量键入时,它会起作用,但当我尝试从变量读取函数时,会出现错误,即函数是字符串。。知道为什么吗?我能解决这个问题吗?如果你能创建一个相对简单的例子来产生错误,我