google-apps-script - 是否有一个 Google Apps 脚本函数告诉脚本在填充特定列后运行?
问题描述
我正在创建一个脚本来自动对行进行排序,但我不希望行移动,直到该行中的所有单元格都被填充
我有以下代码:
SHEET_NAME = "New";
SORT_DATA_RANGE = "A2:M999";
SORT_ORDER = [
{column: 2, ascending: true}, // 3 = column number, sorting by
descending order
{column: 1, 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 complete.');
}
但是,一旦我填充了第 2 列,行就会在我可以填充第 3-13 列之前进行排序。
我希望在填充所有其他列之后对行进行排序。
解决方案
您想在单元格 B2 上使用 onEdit 触发器对列进行排序,但前提是第 2 行、第 3 到 13 列中的单元格已经被填充。
以下答案解决了仅在满足某些条件时才执行排序所需的逻辑。这有几个关键要素:
- 使用事件对象- 它让生活更轻松。
- 获取第 2 行第 3 到第 13 列 (
editedsheet.getRange(editedRow,3,1,11).getValues();
) 的数据,以便可以在循环中对其进行评估。 - IF#1:测试编辑的单元格是否为 B2 (
if (editedRow == 2 && editedCol == 2){
)- 如果是,则循环遍历值范围 (
for (var i=0;i<rowdata[0].length;i++){
) - 如果否,则中止。
- 如果是,则循环遍历值范围 (
- IF#2:循环内部:测试每个值是否存在(
if (rowdata[0][i] > 0){
)- 如果OK,则循环中的下一项
- 如果不正常,则通过使用中止
return;
- 如果你到最后 IF#1,然后进行排序。
function onEdit(e) {
//so5856469701
var ss = SpreadsheetApp.getActiveSpreadsheet();
// get edited variables
var editedCell = e.range;
var editedRow = editedCell.getRow();
var editedCol = editedCell.getColumn();
var editedsheet = ss.getSheetByName(e.source.getSheetName());
// Logger.log("DEBUG: Cell = "+editedCell.getA1Notation()+", row = "+editedRow+", column = "+editedCol)
//get the data from columns 3 to 13 for the edited row
var rowdata = editedsheet.getRange(editedRow,3,1,11).getValues();
//do stuff ONLY if the edited cell was B2
if (editedRow == 2 && editedCol == 2){
// Logger.log("DEBUG: edited cell was in the right row or column. Continue processing");
//loop through the data range
for (var i=0;i<rowdata[0].length;i++){
// Logger.log("DEBUG: value = "+rowdata[0][i]);
// assumes data is numeric, otheriwse test for .length>0
// if the value in the dat range >0, then
if (rowdata[0][i] > 0){
// Logger.log("DEBUG: greater than zero");
}else{
Logger.log("DEBUG: value in column "+(+i+1)+" is NOT greater than zero; script abort");
return;
}
}
Logger.log("got through the if; now run the sort");
// to get this far, all the cells in columns 3 to 13 have values so the sort can proceed
// insert sort code
}else{
Logger.log("DEBUG: edited cell wasnt in the right row or column");
}
}
推荐阅读
- excel - 在 excel 2016 中的 .onAction 中使用 Vba excel 传递参数
- android - 如何在子片段中实现导航控制器?
- angularjs - 在 AngularJS Grid 中创建“DropDown”和“Radio Switch”单元
- javascript - 如何在数组 javascript 中找到匹配字符串?
- python - 在 python 中使用 genlaguerre 的错误?
- java - 执行jar文件时如何传递一长串JVM参数
- c++ - 反转纵横比时,OpenCV调整大小返回空图像
- mysql - 在 MySQL 的同一 UPDATE 语句中更新后使用原始列值
- python - 在多视图几何中最接近另一个 3D 点的线上查找 3D 点?
- java - groovy http-builder 模块现在在哪里?