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
}

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