2017-09-15 479 views
0

我在Google Spreadsheet中使用腳本,在表單提交時,複製現有電子表格和Google表單,以創建新電子表格和新表單,然後連接新表單到新電子表格,新電子表格正在接收新表單的響應。Google Apps腳本 - 複製電子表格中的腳本不保留觸發器

複製的電子表格中的腳本被複制到新的電子表格中,但安裝的觸發器不存在。有沒有辦法從原始電子表格的腳本(接收創建新的SS和表單的表單提交的電子表格)創建這些觸發器,還是需要依靠新電子表格中未安裝的觸發器來創建已安裝的觸發器?

回答

0

觸發器運行需要用戶授權的腳本。由於您的腳本綁定到電子表格,因此需要在每個副本上進行授權。

我有一個類似的系統(副本的主表+代碼),我們通過添加一個自定義菜單來運行腳本,當有人做副本時解決了這個問題。我添加了一個自定義菜單和一個setup腳本來授權觸發器。

function onOpen(e) { 
    var ui = SpreadsheetApp.getUi().createMenu("PGP Setup").addItem("Run", "setup").addToUi(); 
} 

function setup() { 
    var ss = SpreadsheetApp.getActive(); 
    ScriptApp.newTrigger('makeDocs') 
    .timeBased() 
    .everyHours(1) 
    .create(); 
} 

很容易對誰創造了片,並已可靠爲我們到目前爲止用戶。

1

我能解決我的問題與下面的代碼。函數'newSSTrigger'在原始腳本中(不是複製的),並且在新的SS和Form被創建和同步後調用 - 這是變量idOfNewSS的來源。觸發器不會在新對象中創建腳本,甚至不會在新對象的腳本中看到已安裝的觸發器。要查找觸發器,請從任何腳本編輯>所有觸發器。不會灰顯的觸發器以某種方式附加到文檔中。

這似乎有兩個好處: 1)我從來沒有處理任何權限 - 觸發器的工作沒有我觸摸新的文檔。 2)如果我更新'myFunction'(如下),它將更改現有觸發器的工作方式,因爲觸發器會從原始腳本中檢索其指令 - 在當前狀態下。這意味着我可以通過編輯此函數來更新由此腳本創建的所有現有觸發器。

function newSSTrigger(idOfNewSS) { 
    var newSS = SpreadsheetApp.openById(idOfNewSS); 
    ScriptApp.newTrigger("myFunction") 
    .forSpreadsheet(newSS) 
    .onFormSubmit() 
    .create(); 
} 

function myFunction() { 
    do stuff... 
} 
相關問題