Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 我是否可以连接来自某个源代码的一段代码,并使用Google应用程序脚本执行它?_Google Apps Script - Fatal编程技术网

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”,等等}
请参阅底部带有新代码的更新答案。因此,当我将函数作为全局变量键入时,它会起作用,但当我尝试从变量读取函数时,会出现错误,即函数是字符串。。知道为什么吗?我能解决这个问题吗?如果你能创建一个相对简单的例子来产生错误,我