2012-07-20 51 views
2

我有一個帶有onEdit觸發器的Google電子表格,用於創建第二個基於時間的觸發器。GAS將變量傳遞給基於時間的觸發器

簡單地說:當status列被編輯爲'Approved'時,會創建一個觸發器,以在提供的項目完成日期發送反饋電子郵件。

var oneTimeOnly = ScriptApp.newTrigger("emailFeedback").timeBased().at(endDate).create(); 

我希望將變量傳遞給第二個觸發器。我可以創建項目屬性或在電子表格中添加一列。但是,創建觸發器時傳遞該變量會更簡單。

當我在newTrigger引號中插入任何其他字符時,這會導致函數的全部內容存儲在觸發器中(隨後失敗)。

var oneTimeOnly = ScriptApp.newTrigger(「emailFeedback (regEmail)」).timeBased()。at(endDate).create();

有沒有辦法在觸發器內存儲變量?

+0

GAS通過 j08691 2013-03-13 17:23:51

回答

3

使用ScriptDB和新的函數(),我能夠創建一個創建動態觸發函數的方法。

解決方案的要點是存儲要觸發的代碼是要傳遞與參數DB:

"myFunction('Hello world')" 

然後,腳本啓動的時候,作爲一個全局變量,你附加從您的ScriptDB新創建的功能。 (我在動態我的鏈接下面的做到了這一點。)

globalFunctions.callThisOne = new Function("e", "myFunction("Hello world")); 

最後,當您創建觸發器,您可以使用全局可訪問的功能,例如創建它:

ScriptApp.newTrigger("globalFunctions.callThisOne").timeBased().everyDay(1).create(); 

我已經寫了一篇關於此事的短文,並張貼了消息來源。希望它是有用的。

你可以閱讀更多關於它在這裏:http://goo.gl/wbUqH6

或者看到這裏的代碼:http://goo.gl/zjUiYe

+0

這是行得通的,但看起來GAS團隊已經刪除了以我描述的方式調用函數的能力。 – fooby 2013-08-28 10:46:23

+0

我還沒有測試過,但理論看起來很合理。如果它有效,它會很棒! :) – John 2014-02-21 17:10:20

2

對不起,沒有辦法做到這一點。

1

使用ScriptProperties.setProperty()來存儲可以通過觸發方法訪問的序列化參數。

+0

您可以在需要設置此屬性的位置提供一些上下文嗎? – Qpirate 2013-03-13 17:41:14

2

據我所知,正確的是,問題是如何將數據傳遞給谷歌腳本項目中的時間觸發函數。 Eoin描述了一種情況,但你可能面對很多情況。 您的腳本處理可能會運行很長時間的複雜電子表格的經典情況。正如你可能知道每個腳本有大約6分鐘的運行時間限制。這種情況下,應該將腳本分成較小的邏輯分區,並在每個邏輯分區的末尾創建一個新的觸發器以供下一部分使用。好的,但下一部分必須知道當前正在運行的腳本變量的一些數據。因爲沒有辦法通過newTrigger()傳遞這些數據,所以你可以創建一個快照並以序列化的方式放入腳本屬性上下文中。 一個簡單的方法來做ScriptProperties.setProperty()

0

@ user2166613是正確的,但有點短。這是如何做到這一點。

我顯示了一個使用after()觸發器的示例。這是一個非常有趣的用例,因爲它允許將耗時的任務從例如網頁應用程序調用,所以調用立即返回控制,並在後臺完成處理。

在我的示例中,我調整了延遲運行的函數中的工作表的列寬。

// call this function to set a time based trigger and transfer parameters 
function setTimeTrigger_AdaptColumnWidths() { 
    var ssId = SpreadsheetApp.getActiveSpreadsheet().getId(); 
    var wsId = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId(); 

    var scriptProperties = PropertiesService.getScriptProperties(); 
    scriptProperties.setProperty('spreadsheetId', ssId); 
    scriptProperties.setProperty('worksheetId', wsId); 

    // Delay 10 secs, but real execution time may vary up to 15 min! 
    ScriptApp.newTrigger('adaptColumnWidths').timeBased().after(10000).create(); 
} 

// this function is called by the trigger 
function adaptColumnWidths() { 
    var scriptProperties = PropertiesService.getScriptProperties(); 
    ssId = scriptProperties.getProperty('spreadsheetId'); 
    wsId = scriptProperties.getProperty('worksheetId'); 

    // getSheetById() is a custom function – see below – not yet in Spreadsheet Class! 
    sheet = getSheetById(SpreadsheetApp.openById(ssId), wsId); 

    // now do what we want to do in the timeBased trigger 
    for (var i = 1; i <= sheet.getLastColumn(); i++){ 
    sheet.autoResizeColumn(i); 
    } 
} 

// ----- 

// custom function – hopefully this will become a method of Spreadsheet Class any time soon 
function getSheetById(ss, wsId) { 
    var sheets = ss.getSheets(); 
    for (var i=0; i<sheets.length; i++) { 
    if (sheets[i].getSheetId() == wsId) return sheets[i]; 
    } 
} 

請注意,您在數據空間存儲這裏是共同所有的函數調用。因此在短時間內多次呼叫可以覆蓋其他參數。

在我的用例中,這不是問題,因爲電子表格和工作表不會改變。但不要嘗試傳輸可能因呼叫而改變的數據。

執行的真正時刻可能會長達15分鐘(無論您要求什麼確切時間),因此有足夠的空間讓多個函數調用互相干擾!