首页 > 解决方案 > 获取选定范围内的值和行号,单元格之间有间隙?

问题描述

所选范围示例

我需要在 Google 工作表脚本中获取超出选定范围的值和行号。

最初的问题是我试图使用此脚本获取选定范围的值和行号:

sheet = ss.getActiveSheet(),
  sheetvalues = sheet.getActiveRange().getValues();
  for (i=0; i<sheetvalues.length; i++) {
  mr = sheet.getActiveRange().getRow()+i;
  }

但我发现如果你使用文件管理器并选择一个范围,那么所有隐藏的单元格也将成为活动范围的一部分,但我只需要那些在过滤范围内的单元格。我决定最好的方法是一个一个地单独选择单元格。我无法获得值和行索引,因为它仅将最后一个选定的单元格计为活动范围。

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 在工作表的选定行下,您想使用 Google Apps 脚本检索未选定行的行号。

在这种情况下,我认为getSelection可以使用的方法。并且,为了确认行,getActiveRangeList使用。当这反映到示例脚本时,它变成如下。

示例脚本:

当您使用这个脚本时,首先,请选择像您的示例图像一样的单元格并运行脚本。

function myFunction() {
  // 1. Retrieve the selected ranges.
  const selection = SpreadsheetApp.getSelection();

  // 2. Retrieve the selected row numbers.
  const selectedRows = selection.getActiveRangeList().getRanges().flatMap(r => {
    const row = r.getRow();
    const temp = [];
    for (let i = 0; i < r.getNumRows(); i++) {
      temp.push(row + i);
    }
    return temp;
  }).sort((a, b) => a - b);

  // 3. From data range, retrieve the row numbers except for the selected row numbers.
  const sheet = selection.getActiveSheet();
  const range = sheet.getDataRange();
  const rowNumbers = [];
  for (let r = 1; r <= range.getNumRows(); r++) {
    if (!selectedRows.includes(r)) rowNumbers.push(r);
  }
  console.log(rowNumbers); // Here, you can see the retrieved row numbers at the log.

  // 4. Retrieve the row values of the retrieved row numbers.
  // If you want to retrieve the row values of "rowNumbers", you can also the following script.
  const allValues = range.getValues();
  const values = rowNumbers.map(n => allValues[n]);
  console.log(values); // Here, you can see the values of row numbers at the log.
}
  • 作为使用所选范围的重点,例如,当依次选择第 3 行、第 1 行、第 2 行的单元格时,范围列表返回单元格的顺序。所以在这个示例脚本中,检索到的行号是排序的。

  • 例如,在运行上面的脚本时,当数据范围为“ A1:C5”时,并且选择单元格“ A1”,“ A3”和“ A5”时2, 4

参考:


推荐阅读