首页 > 解决方案 > 是否有一个 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 列之前进行排序。

我希望在填充所有其他列之后对行进行排序。

标签: google-apps-script

解决方案


您想在单元格 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");
  }    
}

推荐阅读