我可以从一些来源连接一段代码并使用Google应用程序脚本执行它吗?

时间:2017-02-26 10:11:53

标签: google-apps-script



                                                                                       var ss = SpreadsheetApp.getActive();
var sourceSheet = ss.getSheetByName('Source');
var sourceValue = sourceSheet.getDataRange().getValues();
var source = sourceValue[0][0];

Logger.log(source);

FUNC_CONTENT_TO_INJECT = source;

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);
};




您好我已经创建了一个Adwords脚本,它运行得很完美。 有没有办法让我的代码放在电子表格中,让主脚本运行这段代码并执行它?

我之所以这样做,是因为我不想让任何机构阅读/复制我的剧本,而我现在还没有其他任何解决方案。它看起来像这样:



function main() {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xr3FIVoctvBTyR6N-MILpbqSmMuyd2pvEzO86BuHsK4/');
  var sourceSheet = ss.getSheetByName('Source');
  var sourceValues = sourceSheet.getDataRange().getValues();
  var source = sourceValues[0][0]
  
  //this is where I want to concatenate my code 
  + source
  
}




1 个答案:

答案 0 :(得分:0)

可以使用Apps脚本项目之外的功能内容,并将其注入您的Apps脚本代码中。可以检索函数内容,使用该函数内容创建新函数,然后运行新函数,在完成后不留下任何遗留的代码。您可以使用以下代码向自己证明:

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()

调用

Mozilla Documentation - JavaScript call() method

在上面的示例中,我输入了一个空字符串作为call()方法中的第一个参数。第一个参数的处理方式与所有后续参数不同。第一个之后的所有后续参数都被视为单个变量。第一个参数是thisArg它与this关键字和范围相关。

function.call(thisArg,value1, value2,etc)

同样在上面的例子中,我使用了一个GLOBAL变量来模拟你从电子表格中获得的函数内容。

我建议添加某种条件测试来确定进来的功能内容是否来自你。可以注入来自任何源的任何函数内容,只要可以将代码作为有效代码处理,代码就会运行。由于您的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);
};