【问题标题】:Active Sheet always being leftmost sheet on Google Sheets活动工作表始终是 Google 表格的最左侧工作表
【发布时间】:2021-01-22 19:23:40
【问题描述】:

上一个问题的继续: Detect Note changes with onChange

我知道这是一个重复的问题,但类似问题的答案对我不起作用。

Google App Script getActiveSheet returns leftmost sheet, not active sheet

function createSpreadsheetOpenTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onChange')
      .forSpreadsheet(ss)
      .onChange()
      .create();
}

function onChange(e) {
  var ss = SpreadsheetApp.getActive().getActiveSheet();
  if(e.changeType == 'OTHER') {
    if (ss.getName()=="Completed") {
      var celladdress ='G2';
      ss.getRange(celladdress).setValue(Utilities.formatDate(new Date(), "GMT-08:00", "MM/dd/yyyy HH:mm"));
    }
  }
} 

这是复制问题的样本表。 https://docs.google.com/spreadsheets/d/1pVfIv6NRybK8JH-FgzTLYiTkzu73-8iD77HFZOGk3iA/edit#gid=2124234178

编辑或清除“已完成”表中的注释应将日期写入单元格 G2,但事实并非如此。此外,返回活动单元格的 getRow() 和 getCol() 总是产生 1,可能是由于活动表中不存在该单元格(它仍然卡在最左边的工作表上)。帮助将不胜感激。

编辑:在进一步测试中,问题似乎出在 changeType OTHER 上。如果我将类型更改为 EDIT,则电子表格是正确的。我认为这是一个错误。我希望有一个解决方法。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    function createSpreadsheetOpenTrigger() {
      var ss = SpreadsheetApp.getActive();
      ScriptApp.newTrigger('onMyChange')
          .forSpreadsheet(ss)
          .onChange()
          .create();
    }
    
    function onMyChange(e) {
      var ss = SpreadsheetApp.getActive();
      var sheet = ss.getSheetByName('Completed');
      var celladdress ='G2';
      if(e.changeType == 'OTHER') {
        sheet.getRange(celladdress).setValue(Utilities.formatDate(new Date(), "GMT-08:00", "MM/dd/yyyy HH:mm"));
      }
    }
    

    您安装了 onChange 触发器。 卸载它并安装 onMyChange 触发器。

    【讨论】:

    • 感谢您的回复。与 onChange 相比,onMyChange 是一个更好的触发器吗?我有一个使用 onChange 的工作表流程,我想知道将所有内容更改为 onMyChange 是否会导致任何问题。
    • "与 onChange 相比,onMyChange 是一个更好的触发器吗?"在某种程度上,是的,因为它适用于您的情况:-) 此外,onChange () 和 onEdit () 一样是保留名称。有双重触发的情况。
    • 我注意到您更改了代码而不是更改了触发器名称。这不是我想要的;我希望该功能检查我所在的工作表是否确实称为“已完成”,而不是仅仅抓取已完成的工作表。 if (ss.getName()=="Completed") 是必要的参数。
    • 在帖子本身中没有提到保留If() 的必要性,我自己也没猜到。对不起,我帮不了你。
    【解决方案2】:
    function onMyChange(e) {
      const sh=e.source.getActiveSheet();//there is a source value in the event object which is the current spreadsheet
      //e.source.toast(sh.getName());//helpful when debugging
      if (e.changeType=='EDIT'&& sh.getName()=="Sheet3") {//change type to edit for debugging purpose and the sheet name is different
        sh.getRange('G2').setValue(Utilities.formatDate(new Date(), "GMT-08:00", "MM/dd/yyyy HH:mm"));
      }
      //Logger.log(JSON.stringify(e));//look at  event object
    }
    

    【讨论】:

    • 如果我理解正确,问题的作者想要捕捉 OTHER changeType,而不是 EDIT。 onChange 中好像没有 e.source。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多