我正在尝试在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个单元格的值而不是范围。
sheet.getActiveRangeList()
按预期工作并返回整个“活动范围”的细胞。我知道这一点,因为我可以在这上面调用.clear
并看到所选择的细胞范围清除!sheet.getActiveRangeList().getRanges()
失败 - >这应该返回一个Range对象数组:Range[]
,它确实如此,但该数组只有“活动单元”连续选择是单个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>';
}
补充阅读: