【问题标题】:G Sheets: Group/Separate Rows based on column value, Adding Rows with value or conditional border formatG 表:根据列值对行进行分组/分隔,使用值或条件边框格式添加行
【发布时间】:2021-03-13 21:14:28
【问题描述】:

所以我可以使用多个脚本,其中一个是根据 C 列(日期)自动对工作表进行排序的脚本。

这是样本表:https://docs.google.com/spreadsheets/d/1nP4kZEikx1li8JNwCjsEc3ooadr0fiboglUizUcUdAQ/edit?usp=sharing

基本上,这个想法是让人们能够在底部添加行,添加信息,并在设置日期后立即将其移动到它所属的位置。 问题是我需要在不同日期之间留一个空格,但是手动添加一个空行是行不通的,因为自动排序会将它发送到底部,因为日期单元格是空白的。

无论如何,是否使用 OnOpen 触发器将每个日期与每一天的子标题行分组?基本上可以识别来自 C 列的不同值并为每个值添加一行或从字面上添加任何具有颜色格式的文本?因为我有自动排序脚本,所以即使它们被添加到工作表的末尾也没关系,因为除了 D 列之外的所有其他单元格都是空的,它应该只在每个日期的顶部发送它。

我确实遇到过这个解决方案https://stackoverflow.com/a/55944980/13895051 但我似乎无法让它工作。

这是我正在使用的自动排序脚本,以防万一

SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true},  // 3 = column number, sorting by descending order
{column: 4, 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.');
}

我过去只使用过几个脚本,所以我不知道自己在做什么,而且数据透视表并不是一个真正的选择。我将不胜感激! 谢谢你!

【问题讨论】:

  • 首先,关于I did come across this solution https://stackoverflow.com/a/55944980/13895051 but I can't seem to make it work.,很抱歉我的回答对您的情况没有用处。顺便说一句,当我看到您的示例电子表格时,函数名称为 onEdit 的函数用于每个容器绑定脚本中。在这种情况下,您的脚本没有正确运行。那些onEdit 函数与异步进程一起运行。所以当你测试onEdit的脚本时,除了你要测试的函数onEdit之外,请重命名其他onEdit函数。请注意这一点。
  • 您使用的脚本是什么?您是否设法尝试在没有 onEdit 触发器的情况下运行它并手动执行它?此外,在脚本上,您只是排序而不是分隔单元格,您应该执行一个 for 循环来遍历日期,并且当日期与上一个日期不同时添加一个新行。
  • 我正在使用上面的脚本并手动执行它会起作用我只是不知道我需要做什么来将单元格与新行分开并且我在从 onEdit 更改它时遇到问题到手动。我是一个完整的初学者
  • @tanaike 有什么方法可以在 OnOpen 上方制作脚本并合并我在第一条评论中链接的解决方案?
  • 将脚本设为 onOpen 是什么意思?你的意思是使用简单的触发器onOpen(e)

标签: google-apps-script google-sheets border conditional-formatting


【解决方案1】:

我想通了。我最终创建了一个菜单来触发一切。我感到很沮丧,所以我为排序创建了一个菜单项,为了加快进程,我录制了一个宏,在顶部添加一行并将日期单元格更改为“添加日期”。因此,每当有人添加带有新日期的行时,他们都可以在顶部添加一行,添加日期,点击排序,然后一切都在它所属的地方。

这不是一个雄辩的解决方案,但最终效果更好。这样,如果需要编辑多行,它们就不会全部跳来跳去。

在之前的评论中,我提到我尝试了https://stackoverflow.com/a/55944980/13895051 的解决方案并说它不起作用。 这是一个简单的修复。我不得不将日期列的格式更改为纯文本。 下面是按 2 列排序并在行组之间添加边框的成品。

感谢您的帮助和耐心!

SHEET_NAME = "North Tonawanda";
SORT_DATA_RANGE = "A:S";
SORT_ORDER = [
{column: 3, ascending: true},  // 3 = column number, sorting by descending order
{column: 4, ascending: true} // 1 = column number, sort by ascending order 
];

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.');
  sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, 
null, null, null, false, false);
    var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
    var rangeList = values.reduce(function(ar, e, i) {
      if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
        ar.push("A" + (i + 2) + ":S" + (i + 2));
      }
      return ar;
    }, [])
    rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1, 
sheet.getLastColumn()).getA1Notation());
sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, 
"black", SpreadsheetApp.BorderStyle.SOLID_THICK);
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多