【问题标题】:Google App-script Autosort on editGoogle App-script 编辑时自动排序
【发布时间】:2017-01-20 06:00:16
【问题描述】:

我一直致力于对我的数据进行自动排序(基于第 2 行第 1 列数据的升序),我通过在线搜索找到了一些提示,但遇到了一个错误,我似乎无法通过网络找到答案。

所以场景如下:

我有 2 张工作表,Sheet1 和 Sheet2,来自 sheet1 的数据通过 sheet2 链接,尽管 sheet2 有额外的列,

这是sheet1

这是sheet2

请注意,两张表中的 Column lastname 和 code 是相同的,不同之处在于列 Gender (Formatted on drop-down list) & Bdate(cell formatted as date)

我发现一个脚本似乎可以工作,但我不能完全正常工作,这是我运行脚本后的输出。

注意红框内的列,gender 和 bdate 似乎没有按照自动排序。

这是我的代码:

function autosortOnEdit() {
var sheetNames = ["Sheet1", "Sheet2"];
var ss = SpreadsheetApp.getActiveSpreadsheet();
sheetNames.forEach(function(name) {
var sheet = ss.getSheetByName(name);
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn() -1);
range.sort({column: 1, ascending: true});
});
}

我的观察是,我认为此脚本不适用于上述示例格式的单元格。

我想根据 A 列的“姓氏”自动对其进行排序。

我怎样才能使这个脚本即使在格式化的单元格上也能工作?

先谢谢了,我会继续在网上搜索的。

【问题讨论】:

  • 你可以准备样品表来测试吗?
  • link 这是样表,我已经添加了脚本。

标签: google-apps-script google-sheets


【解决方案1】:

不知道如何使用 range.sort({column: 1, ascending: true}); 或它是如何工作的,但每当我想对工作表值进行排序时,我都会执行以下操作:

function myFunction() 
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var rows = sheet.getLastRow();
  var columns = sheet.getLastColumn();

  var sortedValues = sheet.getRange(2, 1, rows-1, columns).getValues().sort();

  sheet.getRange(2, 1, rows-1, columns).setValues(sortedValues);
}

试试这个而不是你的代码,希望这会有所帮助,因为它在我测试时成功地对所有值进行排序。

编辑

要将相同的内容应用于电子表格中的所有工作表,您可以获取工作表名称并在 for 循环中一一进行迭代。检查代码:

function myFunction() 
{
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var currentSheetName, currentSheet;

  for(var i=0; i<sheets.length; i++)
  {
    currentSheetName = sheets[i].getName();

    currentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(currentSheetName);
    var rows = currentSheet.getLastRow();
    var columns = currentSheet.getLastColumn();

    var sortedValues = currentSheet.getRange(2, 1, rows-1, columns).getValues().sort();

    currentSheet.getRange(2, 1, rows-1, columns).setValues(sortedValues);
  }    
}

【讨论】:

  • 这个脚本可以在多张纸上运行吗?
  • 是的,你可以这样写var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();,然后`sheets[0].getName();` 来获取每张纸。现在只需将 sheet1 替换为 sheets[i].getName() 变量。让我知道,如果您需要更多说明,我会自行更新答案。
  • 你能更新你的答案吗?我似乎无法让它工作,你的答案几乎是完美的,我只需要它在多张纸上运行,谢谢
  • @user7254740 我已经更新了答案,希望它是您正在寻找的确切解决方案。检查编辑部分。
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多