2015-06-17 77 views
2

我有一個電子表格,可以用作模板。這個電子表格裏面有幾個腳本,我遇到的問題是當你複製電子表格時,我的所有腳本都停止工作。我必須進入每個腳本並再次手動授權。Google工作表,腳本在複製後停止工作。

我們將爲通過我的部門進行的每項工作制作主電子表格的副本。大約每天20-30份主人將由多人制作。

有沒有辦法避免這種情況?

請參閱下面的示例代碼和電子表格。

感謝,

泰勒

https://docs.google.com/a/costco.com/spreadsheets/d/1vcmjVtS2mKwCGfboVFK14yNoksTJ7pq4vDcKIOpG2oU/edit?usp=sharing

function customDocEmail(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    if (sheet.getName() == "Version 1 ") {; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var triggerCell = sheet.getRange("C17").getValue().toString(); 
    var email = sheet.getRange("A17").getValue().toString(); 
    var EMAIL_SENT = new Date() ; 

    var recipients = "[email protected]"; 
    var cellA1 = ss.getSheetByName("Version 1 ").getRange("A1").getValue().toString(); 
    var cellB2 = ss.getSheetByName("Version 1 ").getRange("B2").getValue().toString(); 
    var cellD1 = ss.getSheetByName("Version 1 ").getRange("D1").getValue().toString(); 


    } 
    var subject = 'New customDoc ' + cellA1+ '-' +cellB2; 
    var body = ' Hi Stephanie,' + '\n' + '\n' + 'This job ' + cellA1 + '-'+ cellB2+ ', is being created as a CustomDoc.. Please view the specs for this job. ' + '\n' + ss.getUrl() +' '+ '\n' + '\n' +'Thank you,' + '\n' + cellD1 +' ' ; 

    if (triggerCell =="YES") 
{MailApp.sendEmail(recipients, subject, body); 
sheet.getRange("C17").setValue("SENT"); 

    } 
} 
function templateMagix() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Version 1 "); 
    var trigger = sheet.getRange("B3").getValue().toString(); 
    var formNumber = sheet.getRange("A23").getValue().toString(); 
    var boom = sheet.getRange("C23").getValue().toString(); 

if (boom =="BOOM") 

    sheet.getRange("B3").setValue(formNumber); 

} 

回答

0

我能夠找到解決這個問題的方法,它對我的​​應用程序來說是完美無瑕的。

我把所有的onEdit腳本放在同一個「Project」中,然後我做了一個按鈕併爲其分配我的timeStamp函數。這促使我需要Auth的所有腳本的授權。

接下來我遇到了所有的「安裝onEdits」,因爲製作電子表格的副本時沒有保留安裝,所以腳本仍然不起作用。多一點挖掘和研究讓我寫一個簡單而有效的腳本,我分配給我新創建的按鈕。然後依次安裝我所有的onEdit觸發器,並提示授權和所有腳本現在按預期工作。

我希望有人處理相同的問題可以在這找到一些用處。

  function authoRize(e) { 

    Browser.msgBox("Great! Let's be friends!"); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("customDocEmail") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("templateMagix") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("GetData") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("GetPJData") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("hideSeek") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("hideSeekOP") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("hideSeekPJ") 
    .forSpreadsheet(sheet) 
    .onEdit() 
    .create(); 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("HOME"); 
    var newDate = new Date() ; 
    sheet.getRange("A5").setValue(newDate); 


    goToSheet('Version 1 '); 

} 
1

你爲什麼要授權腳本一次又一次的原因是因爲您的副本創建被視爲一個新的文件等是附在該文件上的腳本。對於任何能夠運行腳本的新文檔,用戶必須爲該文檔提供運行腳本的權限。能夠在沒有手動授權的情況下進行復制和運行腳本將有點類似於提供腳本未經授權的訪問權限來運行。如果可能的話,可以將其視爲嚴重的安全線索。因此,不幸的是,不提供它們的運行權限就無法運行腳本。儘管取決於你有多少腳本,你的用例以及他們正在執行什麼函數等等,但我會建議如果可能的話,將這些函數合併到一個腳本中,並在必要時調用它們。這樣一來,你將不得不只給腳本提供手動批准一次,而不必做ň次數(假設你有ň腳本)爲每個腳本被授予許可才能運行。

+0

使用這樣的中央腳本將無法正常工作,因爲他從每個電子表格中調用不是來自webapp的腳本。一個workarround是使用onOpen從菜單中顯示一個菜單並授權一次。 –

+0

我試着創建onOpen菜單並授權它,但腳本仍然無法使用。難道我做錯了什麼? –