Google表格,脚本在制作副本后停止工作。

时间:2015-06-17 18:21:37

标签: javascript google-apps-script google-sheets

我有一个我用来作为模板构建的电子表格。这个电子表格里面有一些脚本,我遇到的问题是当你复制电子表格时,我的所有脚本都停止工作了。我必须进入每个脚本并再次手动授权它们。

我们会为通过我部门的每一份工作制作Master电子表格的副本。每天将由多人制作大约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 = "Youremail@gmail.com";
  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);

 }

2 个答案:

答案 0 :(得分:1)

您必须一次又一次地授权脚本的原因是因为您创建的每个副本都被视为新文档,因此附加到该文档的脚本也是如此。并且对于能够运行脚本的任何新文档,用户必须提供该文档运行脚本的权限。能够在没有手动授权的情况下制作副本并运行脚本将有点类似于提供脚本未经授权的运行访问。如果可能的话,可以将其视为严重的安全线程。因此,遗憾的是,如果没有为脚本提供运行权限,就无法运行脚本。

虽然,根据您拥有的脚本数量,用例以及它们正在执行的功能等,我建议如果可以将这些功能合并到一个脚本中并在必要时调用它们。这样,您只需要为脚本提供一次手动权限,而不必多次 n (假设您有 n 脚本)为每个要授予运行权限的脚本。

答案 1 :(得分:0)

我能够找到一个解决方案,它对我的​​应用程序完美无缺。

我将所有onEdit脚本放在同一个" Project"中,然后我做了一个按钮并为其分配了timeStamp函数。这促使授权我所有需要验证的脚本。

接下来,我遇到了安装在线路上的所有""在制作电子表格的副本时没有保持安装状态,因此脚本仍无法正常运行。更多的挖掘和研究让我编写了一个简单但有效的脚本,我分配给了我新创建的按钮。这反过来安装我的所有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 ');

 }