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()
}
}
参考文献:
我有这个自动排序脚本,效果很好,但我不知道如何更改两件事。
我希望它在仅编辑两个特定列(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()
的功能在 sheetNorth 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()
}
}