【发布时间】:2021-10-30 10:53:08
【问题描述】:
所以我得到了这个脚本,它将读取我有日期的第 1 列,并将按月对所有行进行分组,并在其中按天对行进行分组。这是因为在每一天中,我每小时或 4 小时左右都有一排。
当脚本执行时,它将首先按天分组,然后按月分组。 执行月份分组部分时,当某个月份内有第9天和第10天时,将第9天的最后2行和第10天的前2行进行分组,不按月份分组。
如果列不包含第 9 天和第 10 天。假设我只有 16 到 31 天之间的数据,则不会发生此错误。
无法确定此脚本的问题所在。当有一个月的 9 号和 10 号时,如何防止月份分组出现此错误?
function groupRow() {
const timeZone = "GMT+1";
const sheet = SpreadsheetApp.getActiveSheet();
const rowStart = 5;
const rows = sheet.getLastRow() - rowStart + 1;
const values = sheet.getRange(rowStart, 1, rows, 1).getValues().flat();
const o = [];
values.forEach((date, i) => {
const [m, d] = Utilities.formatDate(date, timeZone, "yyyyMM,dd").split(",");
if (!o[m]) {
o[m] = [];
}
if (!o[m][d]) {
o[m][d] = [];
}
o[m][d].push(rowStart + i);
});
var collator = new Intl.Collator([], {numeric: true});
for (var m in o) {
o[m] = Object.values(o[m]).sort((a,b) => parseInt(a) - parseInt(b));
}
Object.values(o).forEach(m => {
for (const d of m) {
if (d.length === 1) {
continue;
}
const range = `${ d[1] }:${ d.slice(-1)[0] }`;
sheet.getRange(range).shiftRowGroupDepth(1);
}
const a = m.flat();
if (a.length === 1) {
return;
}
const range = `${ a[1] }:${ a.slice(-1)[0] }`;
sheet.getRange(range).shiftRowGroupDepth(1);
});
}
这是虚拟文件的链接: https://docs.google.com/spreadsheets/d/1ExXtmQ8nyuV1o_UtabVJ-TifIbORItFMWjtN6ZlruWc/edit?usp=sharing
编辑: 实际上,如果我删除第 9 行的所有行,第 8 和第 10 仍然会发生错误。如果我删除了 10 日的所有行,则不会发生错误。好像是第10天连接到第一行的。
编辑2: 更新了代码,下面是 Yuri Khristich 给出的答案。
【问题讨论】:
标签: google-apps-script google-sheets