2017-02-26 19 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

謝謝,我會努力的,你幫了我很多。 –

相關問題