【问题标题】:Google sheets auto sort script modification to trigger only on specified column change谷歌工作表自动排序脚本修改仅在指定列更改时触发
【发布时间】:2021-03-14 19:25:54
【问题描述】:

我有这个自动排序脚本,效果很好,但我不知道如何更改两件事。

我希望它在仅编辑两个特定列(C 和 D)时触发,而不是由整个工作表中的每个更改触发脚本。

SHEET_NAME = "North Tonawanda";
 SORT_DATA_RANGE = "C:D";
SORT_ORDER = [
{column: 3, ascending: true},  // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order 
];

function onEdit(e){
  multiSortColumns();
}
function multiSortColumns(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(SHEET_NAME);
  var range = sheet.getRange(SORT_DATA_RANGE);
  range.sort(SORT_ORDER);
  ss.toast('Sort Completed.');
}

【问题讨论】:

    标签: sorting google-apps-script google-sheets triggers multiple-columns


    【解决方案1】:

    我相信你的目标如下。

    • 根据您的问题和脚本,您希望在编辑工作表North Tonawanda 的“C”和“D”列时运行multiSortColumns() 的函数。

    在这种情况下,我想建议使用事件对象来实现您的目标。当你的脚本被修改后,变成如下。

    修改脚本:

    从:
    function onEdit(e){
      multiSortColumns();
    }
    
    到:
    function onEdit(e){
      const range = e.range;
      if (range.getSheet().getSheetName() != SHEET_NAME || (range.columnStart != 3 && range.columnStart != 4)) return;
      multiSortColumns();
    }
    

    参考资料:

    【讨论】:

    • 我修改了它,脚本仍然有效,但我尝试编辑一个随机单元格,然后检查了执行,它仍然记录了触发器。我在指定列之前和之后尝试了单元格。此外,每次更改时,工作表底部仍会弹出小白框确认,
    • @Yianni V 感谢您的回复。我带来的不便表示歉意。不幸的是,我无法复制您的情况。当我测试我提议的脚本时,multiSortColumns 在编辑工作表“North Tonawanda”的“C”和“D”列时运行。这是因为我的技术不好。我对此深表歉意。为了正确了解您当前的情况,您能否提供包含您当前脚本的示例电子表格?借此,我想确认一下。当你能合作解决你的问题时,我很高兴。可以配合吗?
    • @Yianni V 顺便说一句,在这种情况下,当编辑单元格时,日志显示简单触发器。当 if 语句为 false 时,您的 multiSortColumnsonEdit 中运行。但是,我无法复制Also the little white box confirmation still pops up at the bottom of the sheet for every change。对此我深表歉意。
    • @Yianni V 来自your this question,当您在this sample Spreadsheet 中测试我提出的脚本时,我认为我提出的脚本可能无法正常工作。我很担心这个。
    • @Yianni V 因为当我看到您的示例电子表格时,函数名称为onEdit 的函数用于每个容器绑定脚本。在这种情况下,您的脚本没有正确运行。那些onEdit 函数与异步进程一起运行。所以当你测试onEdit的脚本时,除了你要测试的函数onEdit之外,请重命名其他onEdit函数。请注意这一点。
    【解决方案2】:

    回答

    我将重写脚本如下。这使它在视觉上更清晰,onEdit 触发器使用SORT_ORDER 变量来查看触发函数的列:

    代码

    SHEET_NAME = "North Tonawanda";
    SORT_DATA_RANGE = "C:D";
    SORT_ORDER = [
      { column: 3, ascending: true },
      { column: 4, ascending: true }
    ];
    
    
    function multiSortColumns() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName(SHEET_NAME);
      var range = sheet.getRange(SORT_DATA_RANGE);
      range.sort(SORT_ORDER);
      ss.toast('Sort Completed.');
    }
    
    function onEdit(e) {
      var editedSheet = e.range.getSheet().getName()
      var columnStart = e.range.columnStart
      var columnEnd = e.range.columnEnd
    
      if (SHEET_NAME == editedSheet
        && columnStart >= SORT_ORDER[0]["column"]
        && columnEnd <= SORT_ORDER[1]["column"]) {
        multiSortColumns() 
      }
    }
    

    参考资料:

    【讨论】:

    • 是的,它更干净,而且效果很好。我最终摆脱了 onEdit 并将其添加到菜单中以手动完成,但现在我将在不同的选项卡上使用它。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多