2015-06-17 138 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菜单并授权它,但脚本仍然无法使用。难道我做错了什么? –