如何使用onOpen触发脚本更改Google表格行为?

时间:2019-06-24 21:13:53

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

根据下面某人的建议,我正在编辑这篇文章:

我的最初目标是,每次打开Goog​​le表格时,我都希望将当前位于单元格A10,A15和A20中的几个“数据验证”下拉菜单的值设置为“选择”选项-这是验证范围内的一个单词,以及其他2个文本值。

我被告知需要在全局范围内进行声明-但是我是一个完整的脚本新手,并且坦率地说,我不知道如何进行这项工作。

任何建议将不胜感激。

function onOpen() {
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');

2 个答案:

答案 0 :(得分:2)

新读者注意事项:

  

问题的原始代码是这个

 //When the sheet is opened, the contents of Cell A2 are cleared and the values in the Data Validation dropdown menus in Cells A10, A15, and A20 are set to the default "Select"


function myFunction() {
  function onOpen() {
    SpreadsheetApp.getActiveSheet().getRange('A2').clearContent();   
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');
}

//When the contents of Cell A2 are edited (changed), the values in the Data Validation dropdown menus in Cells A10, A15, and A20 are set to the default "Select"


function onEdit(e) {
  var ss = SpreadsheetApp.getActive()
  var sheet = SpreadsheetApp.getActiveSheet()
  var cell = sheet.getRange('A2')
  var cellContent = cell.getValue()

  if(cellContent === (edit) {
    SpreadsheetApp.getActiveSheet().getRange('A10').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A15').setValue('Select');
    SpreadsheetApp.getActiveSheet().getRange('A20').setValue('Select');


  }
}

简单触发器不应被声明为另一个函数的局部函数,而应在全局范围内声明。

换句话说,不要将onOpenonEdit放在myFunction内。


Google Apps脚本脚本中的全局作用域函数如下所示:

注意:为简便起见,onOpen代码块{}中仅包含一个代码行。它可以具有任意数量的代码行,它们执行的时间不超过30秒。


另一方面,简单触发器具有一些局限性,因此,除了简单触发器之外,您还应考虑使用可安装的触发器。要了解有关Google Apps脚本触发器的信息,请阅读https://developers.google.com/apps-script/guides/triggers

此外,您还应该牢记Google表格的实时协作功能。如果一个用户打开了电子表格,而另一个用户打开了相同的电子表格,则将触发onOpen(简单且可安装的触发器),并且可以更改第一个用户已编辑的内容。

答案 1 :(得分:2)

经过一些测试,我能够使它工作。正如鲁本所说,onOpen,onEdit不能在任何其他函数中。这些已经指定了一个动作,因此当打开或编辑电子表格时,当onOpen或onEdit动作将自动运行时。

您可以查看有关Apps脚本触发器https://developers.google.com/apps-script/guides/triggers的更多信息,但是在这种特定情况下,每次更新任何单元格时onEdit都会运行,除非您使用事件对象指定了要运行脚本的单元格以了解更多信息https://developers.google.com/apps-script/guides/triggers/events

对于这种特定情况,由于您希望脚本在单元格更新时运行,因此您必须使用e.range.getA1Notation()检查该单元格是否正在更新,getA1Notation()返回A1表示法的范围,以了解更多信息信息检查https://developers.google.com/apps-script/reference/spreadsheet/range#getA1Notation()中有一个示例,可以使您理解以下脚本。

    function onOpen(e){

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();  
  sheet.getRange("A2:A2").clearContent();
  sheet.getRange("A10:A10").setValue("Select");
  sheet.getRange("A15:A15").setValue("Select");
  sheet.getRange("A20:A20").setValue("Select");
}



function onEdit(e){

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();
  var A2 = sheet.getRange("A2:A2");

  console.log(e.range.getA1Notation());
  if (e.range.getA1Notation() === "A2"){

    console.log("A2 Updated");
    sheet.getRange("A10:A10").setValue('Select');
  sheet.getRange("A15:A15").setValue('Select');
  sheet.getRange("A20:A20").setValue('Select');

  } 
}

每次打开电子表格时,onOpen函数将运行,每次单元格“ A2”更改其值时,将执行onEdit函数。基本上,您要检查带有A1表示法的范围是否等于“ A2”,然后它将在if语句中运行代码,否则将执行该函数,但将不执行任何操作,因为单元格A2仍然没有任何更改。通过这样做,我不确定这种执行是否有限制,但是您可以进一步研究,我认为这不会影响,因为它应该在客户端而不是服务器上运行。 / p>

我希望能有所帮助,问候。