Google 工作表自动排序脚本修改以仅在指定列更改时触发

Google sheets auto sort script modification to trigger only on specified column change

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

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

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.');
}

我相信你的目标如下。

  • 根据您的问题和脚本,您希望 运行 multiSortColumns() 的功能在 sheet North Tonawanda 的列“C”和“D”时已编辑。

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

修改后的脚本:

从:
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();
}

参考文献:

回答

我会按如下方式重写脚本。这使得它在视觉上更清晰,并且 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() 
  }
}

参考文献: