【问题标题】:How can I combine multiple onEdit/Trigger Scripts in a Google Sheet?如何在 Google 表格中组合多个 onEdit/Trigger 脚本?
【发布时间】:2020-02-21 19:51:51
【问题描述】:

如果我的措辞不正确,请原谅我,我是 Scripts 的新手,但有人为我制作了一个脚本,可以在我拥有的工作表上运行 onEdit/Triggers。我还有一个用于日期/时间戳的 onEdit 脚本。昨天我让它们都简单地工作了,但是新的 onEdit 触发脚本开始失败;说明我有太多脚本。在触发器上导入的范围具有公式和条件格式。触发阶段 1、阶段 2、阶段 3 和 PIT 代码事件的单元格是数据验证单元格。工作表链接和代码在这篇文章的底部。

所以我想知道的是:

  1. 如何将四 (4) 个脚本合并为一 (1) 个脚本,以及
  2. 如果可以在脚本中添加编码以删除它导入的范围单元格,然后再放置新的触发单元格。因为它导入的每个范围都有条件格式,在触发新范围后会持续存在。

表格链接: https://docs.google.com/spreadsheets/d/1KYSiVggIm7KIKxpJMnUhldrzsIaETCqyjOWJ1a9k1cI/edit?usp=sharing

日期/时间戳代码:

function onEdit(e) {
  const sheetNameFellowshipTracking = 'Fellowship Tracking';
  const dateCol = 43;

  // Get edited sheet.
  const range = e.range;
  const sheet = range.getSheet();

  if (sheet.getName() === sheetNameFellowshipTracking)
  {
    // Get edited row.
    const row = range.getRow();

    if (row >= 4 && row <= 28)
    {
      // Get current time.
      const time = Utilities.formatDate(new Date(), "GMT-05:00", "MM/dd, HH:mm");

      // Set edited datetime.
      const dateModifiedRange = sheet.getRange(row, dateCol);
      dateModifiedRange.setValue(time);
    }
  }
}

第 1 阶段代码:

function onMyEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Fellowship Tracking')return;
  if(e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 1') {
    var srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('B3:G21');
    var desrg=sh.getRange('C33');
    srcrg.copyTo(desrg);
  }
}

function createOnMyEditTrigger() {
  var ss=SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onMyEdit').forSpreadsheet(ss.getId()).onEdit().create();
}

第 2 阶段代码:

function onMyEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Fellowship Tracking')return;
  if(e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 2') {
    var srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('H3:M21');
    var desrg=sh.getRange('C33');
    srcrg.copyTo(desrg);
  }
}

function createOnMyEditTrigger() {
  var ss=SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onMyEdit').forSpreadsheet(ss.getId()).onEdit().create();
}

第 3 阶段代码:

function onMyEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Fellowship Tracking')return;
  if(e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 3') {
    var srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('N3:S21');
    var desrg=sh.getRange('C33');
    srcrg.copyTo(desrg);
  }
}

function createOnMyEditTrigger() {
  var ss=SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onMyEdit').forSpreadsheet(ss.getId()).onEdit().create();
}

PIT 代码:

function onMyEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Fellowship Tracking')return;
  if(e.range.columnStart==7 && e.range.rowStart==31 && e.value=='PIT') {
    var srcrg=e.source.getSheetByName('PIT Sheet').getRange('B5:F17');
    var desrg=sh.getRange('C33');
    srcrg.copyTo(desrg);
  }
}

function createOnMyEditTrigger() {
  var ss=SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onMyEdit').forSpreadsheet(ss.getId()).onEdit().create();
}

【问题讨论】:

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


    【解决方案1】:
    function onMyEdit(e) { 
      const sh=range.getSheet();
      if(sheet.getName()=="Fellowship Tracking" && e.range.rowStart>=4 && e.range.rowStart<=28) {
         const time=Utilities.formatDate(new Date(), "GMT-05:00", "MM/dd, HH:mm");
         sh.getRange(e.range.rowStart,43).setValue(time);
      }
      if(sh.getName()=='Fellowship Tracking' && e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 1') {
        const srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('B3:G21');
        const desrg=sh.getRange('C33');
        srcrg.copyTo(desrg);
      }
      if(sh.getName()=='Fellowship Tracking' && e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 2') {
        const srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('H3:M21');
        const desrg=sh.getRange('C33');
        srcrg.copyTo(desrg);
      }
      if(sh.getName()=='Fellowship Tracking' &&  e.range.columnStart==7 && e.range.rowStart==31 && e.value=='Stage 3') {
        const srcrg=e.source.getSheetByName('ALL Stages+Pit').getRange('N3:S21');
        const desrg=sh.getRange('C33');
        srcrg.copyTo(desrg);
      }
      if(sh.getName()=='Fellowship Tracking' && e.range.columnStart==7 && e.range.rowStart==31 && e.value=='PIT') {
        const srcrg=e.source.getSheetByName('PIT Sheet').getRange('B5:F17');
        const desrg=sh.getRange('C33');
        srcrg.copyTo(desrg);
      }
    }
    

    更复杂的触发器创建函数。

       function createTrigger() {
      //guarantees that you dont create a trigger for a function if there already is one.
      if(!isTrigger('onMyEdit')) {
        ScriptApp.newTrigger('onMyEdit').forSpreadsheet(SpreadsheetApp.getActive().getId()).onEdit().create();
      }
    }
    
    function isTrigger(funcName){
      var r=false;
      if(funcName){
        var allTriggers=ScriptApp.getProjectTriggers();
        for(var i=0;i<allTriggers.length;i++){
          if(funcName==allTriggers[i].getHandlerFunction()){
            r=true;
            break;
          }
        }
      }
      return r;
    }
    

    【讨论】:

    • 谢谢!你又一次了不起!我使用了上面的代码,但是当我在脚本编辑器中运行脚本时,它会显示“ReferenceError:未定义范围(第 2 行,文件“代码”)”。所以我猜是因为它没有触发时间戳或 G31 代码工作是错误的。关于如何解决它的任何想法?还是我可能做错了什么?
    • 您需要创建一个可安装的触发器。这些类型的函数也不能从脚本编辑器运行,因为它们需要一个 onedit 触发事件块。这就是 e 的用途。
    • 明白了,因为时间戳代码本身不会在编辑器中运行。如何创建可安装的触发器?
    • 好的,我看到了你昨天写的脚本:function createOnMyEditTrigger() { var ss=SpreadsheetApp.getActive(); ScriptApp.newTrigger('onMyEdit').forSpreadsheet(ss.getId()).onEdit().create();但是当我将它放入脚本时,它给了我错误“异常:此脚本有太多触发器。必须先从脚本中删除触发器,然后才能添加更多触发器。(第 31 行,文件“代码”)”跨度>
    • 如果我什至没有给你那个脚本可能会更好。只需转到脚本编辑器编辑/当前项目触发器并删除所有 onMyEdit() 触发器,然后自己创建其中一个,然后您就会知道当我使用这些类型的脚本时如何使用该脚本并且不使用该脚本我添加了一些代码以确保没有同名的触发器。但是它给代码增加了额外的复杂性,所以我并不总是包括问题的答案,以使其尽可能简单。但是,是的,这是一个问题。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多