【问题标题】:Automatically group new rows by time period as these are being added / recorded在添加/记录新行时按时间段自动分组
【发布时间】:2021-08-13 16:21:30
【问题描述】:

所以我得到了这个 Google 表格文件,我在其中使用其中一张表格作为日志/历史记录来注册一些值。

我的时间触发器将调用将数据记录到日志的函数是由用户设置的。无论用户选择 1 分钟间隔还是 5、10、15 分钟等,很快日志表就会被填满。所以我想要一种方法让我在脚本编辑器上获得的记录脚本自动对行进行分组,因为这些行是按时间触发器自动添加/记录在日志表上的,同时按天和按月。这意味着月份组和这些天子组内以及在这些子组中的每一个内记录了 1 分钟或 5 等行。这将极大地改善日志表的导航。这可能吗?

我在脚本编辑器上有这个记录代码:

function RECORD_HISTORY() {
  var historySheetName = "HISTORY";
  var historySheet = getSheetWithName(historySheetName);
  if (historySheet == null) {
    historySheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(historySheetName, 1);
  }

  range = historySheet.getRange(2, 1, 1, 9);
  var values = range.getValues();
  values[0][0] = new Date();
  historySheet.appendRow(values[0]);
}

function getSheetWithName(name) {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  for (var idx in sheets) {
    if (sheets[idx].getName() == name) {
      return sheets[idx];
    }
 }
  return null;
}

我知道至少有一个功能可以编辑组等:

shiftRowGroupDepth()

此函数的所有示例都在不同的情况下使用,因此我无法弄清楚如何根据需要使用此函数。你们知道如何去做吗?

这是一个虚拟文件,您可以更好地了解我的日志表: https://docs.google.com/spreadsheets/d/1ExXtmQ8nyuV1o_UtabVJ-TifIbORItFMWjtN6ZlruWc/

编辑: 我希望此工作表/脚本自动完成所有操作,因此我或用户都不需要手动打开工作表和分组行。我什至不想打开文件以按下调用对行分组的函数的按钮。我想要的是一种方法或脚本,它可以按月自动创建行组,并使用其自己的行以月份名称:AUGUST 等,然后在该行/下方/组内/组内,然后在这些日组内,其余的具有每小时日志的行数。此行分组功能应该在文件关闭时自动发生,并且通过时间触发器调用的记录数据的函数将数据记录到日志中。

我希望用户在处理信息、分组等方面没有任何作用。用户应该打开电子表格,以便能够轻松快速地解释数据,并能够轻松导航。

我还希望行在创建后自动折叠,而不是保持展开状态,因为如果这样做会使用户感到困惑。

最后如果把代码和我写的录音功能结合起来会更容易吗? "RECORD_HISTORY()"

让我知道这是否足够清楚。关于时区,我的是 GMT+01:00。

谢谢!

【问题讨论】:

  • 你能提供你预期的输出吗?
  • 如果0:000:01 之间没有空行,则不能分开它们的组(将被串联)。请说明你将如何解决它。
  • 无法访问您的虚拟文件。另外,我的意思是你能根据你的虚拟文件提供你预期的输出吗?
  • 你问的是“月组和这些天的子组”。我的回答中提供了解决方案。所以不是为你写代码。如果需要,请自行尝试并寻求进一步的帮助(请创建一个新问题)。
  • 一些提示:你可以创建一个onOpen触发器来折叠组,在RECORD_HISTORY的末尾调用groupRowtimezone也许BST

标签: google-apps-script google-sheets


【解决方案1】:

function groupRow() {
  const timeZone = 'Your time zone';
  const sheet = SpreadsheetApp.getActiveSheet();
  const rowStart = 6;
  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);
  });
  // console.log(o);
  for (const m in o) { o[m] = Object.values(o[m]); }
  // console.log(o);
  
  Object.values(o).forEach(m => {
    for (const d of m) {
      if (d.length === 1) { continue; }
      const range = `${d[1]}:${d.slice(-1)[0]}`;
      // console.log('d', range);
      sheet.getRange(range).shiftRowGroupDepth(1);
    }
    const a = m.flat();
    if (a.length === 1) { return; }
    const range = `${a[1]}:${a.slice(-1)[0]}`;
    // console.log('m', range);
    sheet.getRange(range).shiftRowGroupDepth(1);
  });
}

【讨论】:

  • 脚本自动对行进行分组,但最后一小时是在前一天分组的。可以修复吗?脚本是否会在每小时添加数据时自动对行进行分组?那将是理想的。还是我必须时不时来调用该函数?如果是这样,它会重新组合先前分组的行还是仅在底部重新组合新的非分组行?最后:这个脚本是否也可以按月分组?就像在一个月的 31 日或 30 日等,在 00:00 它将之前的所有行分组为一个月并创建一个带有月份名称的新行?谢谢!
  • 我认为第一个问题是由于您设置的时区不正确。请仔细检查。关于其他问题,请补充您的问题并一一阐述。
  • 好吧,我就是这么做的。希望它足够清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2015-08-21
  • 2014-12-19
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多