任务:在网络应用中打开Google电子表格,在该电子表格中选择一部分值,然后点击我的网络应用中的按钮,我就会获得选定的值。
我通过Google App脚本尝试了此操作(代码如下)。当我从在线运行脚本并在另一个选项卡中打开电子表格时,这种方法很有效。
function doGet()
{
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getActiveRange().getValues();
//Logger.log(data.length);
for (var i = 0; i < data.length; i++)
{
var output = HtmlService.createHtmlOutput("Product name: " + data[i][0] + ", Quantity:" + data[i][1]);
}
//Logger.log(output.getContent());
return HtmlService.createHtmlOutput(output);
};
但是当我尝试将脚本部署为Web应用程序时,当我单击我的Web应用程序中的按钮时,将已发布的URL作为我的表单的操作。它不起作用。
<form action="https://script.google.com/macros/...." method="get">
<input type="submit" value="call">
</form>
我在我的webapp中添加了上面的代码,其中打开并显示了电子表格!
现在,当我从我的网络应用程序中单击“调用”按钮时,它会抛出错误“TypeError:无法调用方法”getActiveRange“为null。”
我该如何解决这个问题?
答案 0 :(得分:1)
当您在电子表格中运行脚本时,这些行具有意义:
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getActiveRange().getValues();
...但是从Web应用程序运行时它们不会。在这种情况下,没有“活动表”或“活动范围”。
您需要将其表达为:
var sheet = SpreadsheetApp.openById('--ss_id--').openSheetByName('--sheet-name--');
var data = sheet.getRange(--Some-range-expression--).getValues();
......或其中的一种变体。
例如,您无法在电子表格中的用户与Web应用程序之间进行交互,以传递所选单元格。你需要重新考虑你的任务。例如,您可以选择工作表中的单元格。使它们成为通过网络应用程序提供的命名范围。或者您可以添加一个菜单项来创建命名范围。