【问题标题】:Getting row number when day changes on column 1 with dates当第 1 列的日期随日期变化时获取行号
【发布时间】:2021-09-06 01:43:58
【问题描述】:

是否可以使用GAS获取同一天的日期块的第一行的行号?

在这种情况下,我需要获取行号“38”,因为它是 9 月 5 日行块的第一行。

目前我正在使用:

function groupDays() {
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LOG');
rowStart = sheet.getLastRow() - 24;
rows = sheet.getLastRow() - rowStart + 1;
dates = sheet.getRange(rowStart, 1, rows, 1).getValues().flat();
  groupDates(dates, 'date');
}

我没有发布整个脚本,因为它有点长。我正在使用脚本按日、月和年对行进行分组。现在我正在尝试处理 按天分组行 部分。 所以rowStartvariable 是脚本开始对行进行分组的行号。这个rowStart 变量需要随着行不断被记录而前进,否则每当执行脚本时,组将被复制、三重复制、四重复制等。

问题是我认为-24 不是一个好方法,因为有时由于 Google 触发器错误而无法记录数据,因此可能会跳过几行,这将导致分组函数从已经分组到前一天的行,这将复制前一天的组。

该脚本将在比较最后 2 行时执行,它检测到一天中的最后一行。然后它应该为属于刚刚结束的那一天且未分组的行创建一个组。

那么有没有办法使用 Google Apps 脚本来获取最后一天行块中第一行的行号?

这是我的虚拟文件: https://docs.google.com/spreadsheets/d/1ExXtmQ8nyuV1o_UtabVJ-TifIbORItFMWjtN6ZlruWc/edit?usp=sharing

编辑:

我使用了以下答案之一并进行了一些更改:

function getRowDay() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LOG");
  var dateDay = sheet.getRange(sheet.getLastRow()-1, 1).getValue();
  var dayPlusMonth = Utilities.formatDate(dateDay, Session.getScriptTimeZone(), "dd/MM/YYYY");
  var cells = sheet.getRange("A5:A").createTextFinder(dayPlusMonth).findAll().map(x => x.getRowIndex());
  var firstRowOfDay = cells[0];
  //return cells[0];
  // log start
  console.log(dayPlusMonth);
  console.log(firstRowOfDay);
  console.log(sheet);
  console.log(dateDay);
  console.log(cells);
}

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    答案:

    您可以使用.getLastRow() 提取最新日期,然后使用单元格的值作为文本查找器参数来查找以该日期开头的所有单元格。

    代码:

    function getRow() {
      const ss = SpreadsheetApp.getActiveSpreadsheet()
      const sheet = ss.getSheetByName("LOG")
      const date = sheet.getRange(sheet.getLastRow(), 1).getDisplayValue().slice(0, 11)
    
      const cells = sheet.getRange("A1:A").createTextFinder(date).findAll().map(x => x.getRow())
    
      return cells[0]
    
    }
    

    这段代码的概要:

    • 获取名为LOG的工作表。
    • 获取此工作表 A 列中的最后一个单元格,并提取单元格的前 10 个字符(这将是没有时间的日期部分,例如 06/09/2021
    • 使用文本查找器在 A 列中搜索包含此日期的所有单元格
    • 将这些单元格范围映射到它们对应的行号
    • 返回 A 列中以此日期开头的第一个单元格

    参考资料:

    【讨论】:

      【解决方案2】:

      这是最简单的方法。只需使用下面的findIndex() 函数并为其指定要查找的日期、月份和年份以及电子表格中的数据。让我知道这是否是您正在寻找的。​​p>

      const findIndex = (day, month, year, rows) =>
        rows.findIndex(
          row =>
            new Date(row[0]).getDate() === day &&
            new Date(row[0]).getMonth() === month - 1 &&
            new Date(row[0]).getFullYear() === year
        ) + 1;
      
      const yourFunc = () => {
        const rows = SpreadsheetApp.getActiveSpreadsheet()
          .getActiveSheet()
          .getDataRange()
          .getValues();
        const index = findIndex(5, 9, 2021, rows); // first row for 5th of September
        console.log(index);
      };
      
      

      【讨论】:

      • 我为此使用了其他东西,您可以在我的正文中查看。我无法让这个工作,因为我无法理解它是如何工作的,因此无法将它连接到我的脚本。有什么我应该知道的才能让这个工作吗?使用这个而不是我发现工作的那个有什么好处吗?谢谢!
      • @Verminous 你不应该使用它。这是功能风格编码的纯艺术! :)
      • @Verminous 您只需将 findIndex() 复制为脚本中的一个单独函数,并按照 yourFunc() 中的使用方式作为示例使用它。如果您对语法感到困惑,请查看 JavaScript 中的箭头函数。
      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2021-11-04
      • 2017-11-10
      • 2015-04-26
      • 1970-01-01
      • 2021-05-25
      • 2016-04-16
      相关资源
      最近更新 更多