2017-02-26 54 views
1

我可以连接来自某个源的一段代码并使用Google应用脚本执行它吗?

                     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

可以使用功能内容的Google Apps脚本项目之外,并将它注入到你的Apps Script代码。可以检索函数内容,使用该函数内容创建一个新函数,然后运行新函数,并在完成后不留下留下的代码痕迹。你可以用下面的代码证明给自己:

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

非常感谢。如果我的功能比处理2个变量稍微复杂一点怎么办?我试图根据自己的需要调整想法,但似乎并未奏效。 –

+0

您可以创建一个变量对象,以便您只有一个参数,并且所有数据都在一个对象内。该对象将会有任何数量的变量。 JSON对象 - >'{“key1”:“value1”,“key2”:“value2”等等}'用底部的新代码查看更新后的答案。 –

+0

谢谢,我会努力的,你帮了我很多。 –

相关问题