首页 > 解决方案 > 如何使用 .sort 命令修复 Google 表格自动排序器中的 TypeError?

问题描述

我正在尝试在 google 表格中进行自动分类,但是当我尝试运行我的代码时收到一条错误消息。我在网上搜索了一个解决方案,但只能找到与 JavaScript 相关的东西,我不太确定它们有多相似。我的代码如下所示:

function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
["January", "February", "March"].forEach(function (s) {
var sheet = ss.getSheetByName(s);
var range = sheet.getRange('L11:M40').getValues();
var result = range.filter(String);
result.sort([{column: 2, ascending: false}])

我得到的错误信息是这样的:

TypeError: The comparison function must be either a function or undefined  
(anonymous)  @ Code.gs:35 <--(The result.sort line)  
onEdit  @ Code.gs:31 <--(The function onEdit line)

如果我理解正确,我需要将 .sort 命令嵌套到另一个函数中,但我不知道该怎么做。我该怎么做呢?我对编程比较陌生,所以我不太确定自己在做什么,尤其是使用 Google App Scripts。

标签: sortinggoogle-apps-script

解决方案


您似乎正在尝试使用Range.sort(sortSpecObj)对数组数据进行排序。

由于您已经使用Range.getValues()并使用了 array.filter()获取范围值,因此您的结果变量是一个数组。您可以使用array.sort(),它有一个可选参数compareFunction,用于定义替代排序顺序。

样品表:

在此处输入图像描述

使用 Array.Sort() 的示例代码:

function sortArray() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
  var range = sheet.getRange("L1:M5").getValues();
  var result = range.filter(String);
  Logger.log(result);
  result.sort(function(a,b){ return b[1]- a[1]
  });
  Logger.log(result);
}

输出:

在此处输入图像描述

2:38:45 AM  Notice  Execution started
2:38:46 AM  Info    [[A, 1.0], [B, 2.0], [C, 3.0], [D, 4.0], [E, 5.0]]
2:38:46 AM  Info    [[E, 5.0], [D, 4.0], [C, 3.0], [B, 2.0], [A, 1.0]]
2:38:47 AM  Notice  Execution completed

使用 Range.Sort() 的示例代码:

function sortRange(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
  var range = sheet.getRange("L1:M5");
  Logger.log(range.getNumColumns());
  range.sort({column: 13, ascending: false});
  Logger.log(range.getValues());
}

输出:

在此处输入图像描述

2:39:53 AM  Notice  Execution started
2:39:54 AM  Info    2.0
2:39:54 AM  Info    [[E, 5.0], [D, 4.0], [C, 3.0], [B, 2.0], [A, 1.0]]
2:39:55 AM  Notice  Execution completed
  • 请注意,使用Range.sort(sortSpecObj)时,工作表会自动更新/排序。
  • 列号不是基于选择的范围,而是基于实际的工作表列。示例如果要对列 M 进行排序,列值应为 13

推荐阅读