首页 > 解决方案 > 自动排序代码是谷歌脚本没有按预期工作

问题描述

当列(Col X)中发生任何编辑时,我正在尝试对我的电子表格进行排序;根据在 (Col X) 中输入的新值,一个简单的公式计算 (Col Y) 中的值。

我正在尝试根据该公式的输出对电子表格行进行排序(输出可以是 1 到 5 之间的任何数字)

该代码无法正常工作,因为它似乎随机交换行,但是当我在 (Col Y) 中手动插入数字而不是公式时,它会正确排序。

function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  
  if(editedCell.getColumn() == 8)
  {   
    var range = sheet.getRange("A2:H25");
    range.sort( { column : 1, ascending: true } );
  }

} 

感谢您的帮助。

标签: google-apps-scriptgoogle-sheetsspreadsheet

解决方案


排序触发onEdit

您希望在更新列中的值时对其进行排序。排序顺序将由另一列中的值确定,该值基于更改的列通过公式计算。

因此,如果您有这样的表:

一个
1 =兰德()*A1
2 =兰德()*A1
3 =兰德()*A1

当您更改 A 中的值时,B 将重新计算,脚本将采用 B 中重新计算的值并根据这些新值对其进行排序。

您当前的脚本

function onEdit(event){
  // Gets the active sheet (which may not be the edited sheet!)
  var sheet = event.source.getActiveSheet();
  // Gets the currently selected cell (which may not be the edited cell!)
  var editedCell = sheet.getActiveCell();
  
  // If the currently selected cell is in column 8 (Column H)
  if(editedCell.getColumn() == 8)
  { 
    // Select the range A2:H25 and sort it according to column 1
    var range = sheet.getRange("A2:H25");
    range.sort( { column : 1, ascending: true } );
  }
} 

虽然有时这可能会起作用,但通常onEdit会有一点延迟,因此如果您在未运行时选择另一个单元格,则脚本可能无法按预期工作。您需要从事件对象中获取范围。

修改后的脚本

我看不到您的数据,所以我制作了一个带有数据的样本表,如RAND上面使用的示例所示。

function onEdit(event){
  // Gets the edited range
  var editedRange= event.range;
  // Gets the edited sheet from the edited range
  var editedSheet= editedRange.getSheet()

  // Checks if the edit appeared in the right sheet and column
  if(editedRange.getColumn() == 1 && editedSheet.getName() == "Sheet1")
  { 
    // Sorts the range
    var range = editedSheet.getRange("A1:B5");
    range.sort( { column : 2, ascending: true } );
  }
} 

您将需要更改工作表名称检查以及列号和范围(取决于您的数据)

现在如果 A 列被编辑,范围将根据 B 列中的值进行排序。

参考


推荐阅读