Google Apps脚本getRanges会返回一个包含单个范围的列表

问题描述 投票:1回答:1

我正在尝试在Google Apps脚本中获取所选单元格的范围,并将它们链接到HtmlOutput

我的电子表格中的一列有HTML输入。例如:<p>Hello <em>World</em></p>。我们的想法是简单地预览HTML。

我的用例是用户通过拖动光标选择一系列单元格(多行,相同列),然后预览所选行的内容。

我试图用这段代码做到这一点:

function previewModal() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ranges =  sheet.getActiveRangeList().getRanges();
  var html = HtmlService.createHtmlOutput('');
  for (var i = 0; i < ranges.length; i++) {
    var contentCell = ranges[i];        
    var htmlContent = contentCell.getValue();
    html.append('<div>').append(htmlContent).append('</div>').append('<hr>');
  }
  html.setWidth(1000).setHeight(1000);
  SpreadsheetApp.getUi().showModalDialog(html, 'Preview');
}

然而,当我运行它时,我看到ranges.length等于1,无论我选择了多少个单元格。范围包含的单元格是“活动”单元格 - >这是您在拖动以覆盖更多单元格之前首先单击的单元格。因此,我的HTML输出只包含该1个单元格的值而不是范围。

我的意思是“活跃细胞”和“活跃范围”:

What I know so far:

  • sheet.getActiveRangeList()按预期工作并返回整个“活动范围”的细胞。我知道这一点,因为我可以在这上面调用.clear并看到所选择的细胞范围清除!
  • sheet.getActiveRangeList().getRanges()失败 - >这应该返回一个Range对象数组:Range[],它确实如此,但该数组只有“活动单元”
google-apps-script google-sheets
1个回答
1
投票

连续选择是单个Range。改为使用Range#getValues来访问给定Range的所有值。 Range#getValue()将始终只返回左上角的值,即使Range中有超过1个单元格。

function previewModal() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet(),
        ranges =  sheet.getActiveRangeList().getRanges(),
        htmlPrefix = "",
        html = ranges.reduce(function (rgSummary, rg) {
          var summary = rg
              .getValues() // 2D array
              .reduce(arrayToHtmlReduceCallback_, "");
          return rgSummary + summary;
        }, htmlPrefix);
  const output = HtmlService.createHtmlOutput(html).setWidth(1000).setHeight(1000);
  SpreadsheetApp.getUi().showModalDialog(output, 'Preview');
}

function arrayToHtmlReduceCallback_(acc, row, i, allArrayRows) {
  const rowSummary = row[0]; // Using only the content of the first column.
  return acc + '<div>' + rowSummary + '</div><hr>';
}

补充阅读:

© www.soinside.com 2019 - 2024. All rights reserved.