首页 > 解决方案 > Google表格:在表格之间移动行和排序​​时如何处理过滤视图?

问题描述

感谢您花时间看这个。

我有一张工作表,我在其中拼凑了一个脚本,该脚本在编辑某个值时移动一行,然后对所涉及的工作表进行多种排序,以便该行在新工作表上按顺序排列。效果很好。

但是,现在问我是否可以使用过滤器进行这项工作。这就是事情变得不稳定的地方。当使用过滤器时,排序功能会在它们移动一行时破坏过滤器。此外,过滤后的括号会缩小,尽管行已排序并最终在过滤后的括号内,但其他行会被推出,等等。这有点难以解释,所以这里有两个例子:

在未经过滤的工作表中运行的脚本:https ://docs.google.com/spreadsheets/d/1Uwge7eS6DXJvbNi-7kRY9djg4Cq2r4QO9BeyNjnhkCg/edit?usp=sharing

脚本功能和破坏过滤器:https ://docs.google.com/spreadsheets/d/1fXJ8_5bqYCOpm6PlModT-GpymL8zrS0NXkhSYweZX6Y/edit?usp=sharing

(如果需要,您可以关闭和打开过滤器以将其重置)

移动行时,是否可以在活动过滤集中对其进行排序?我不确定这是可能的。是吗?

我的解决方法是让排序函数在 onOpen 上执行,这样它们就不会破坏任何人过滤的数据,但是这张表有相当多的用户,所以我不确定它是否曾经关闭过。还有其他建议吗?

感谢您的时间和考虑。谢谢你。我希望有一天我能回报这个人情。

这是脚本:

SORT_DATA_RANGE = "A2:F99"
SORT_ORDER= [
  {column: 4, ascending: true},
  {column: 5, ascending: true}];

function onEdit(event) {
  movethings1(event);
  sortthings1()
  sortthings2();
}

function movethings1(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if(r.getColumn() == 2 && ( r.getValue() == "paid" || r.getValue() == "unpaid"
  || r.getValue() == "pending") ) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet;
    if(r.getValue() == "paid")
      targetSheet= ss.getSheetByName("Paid");
    else if(r.getValue() == "unpaid")
      targetSheet= ss.getSheetByName("Unpaid");
    else if(r.getValue() == "pending")
      targetSheet= ss.getSheetByName("Unpaid");
    
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);}
}

  function sortthings1() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Unpaid");
    var range = sheet.getRange(SORT_DATA_RANGE);
    range.sort(SORT_ORDER);}

 function sortthings2() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Paid");
    var range = sheet.getRange(SORT_DATA_RANGE);
    range.sort(SORT_ORDER);
    ss.toast('done that thing you wanted');}

标签: sortinggoogle-apps-scriptgoogle-sheetsfiltered

解决方案


推荐阅读