我发现getActiveRange(),getActiveSelection()等函数仅在脚本作为电子表格或容器扩展中的自定义函数运行时才起作用(请参阅Execution Methods for Scripts)。我的观察是否正确?有没有办法将脚本部署为Web应用程序,使用SpreadsheetApp.openById()打开电子表格并获取有效范围/选择,假设电子表格的所有者在云端硬盘中打开了它?
问题是我正在为Google Spreadsheets扩展,但是为了构建我的自定义UI,我不想使用Html Service或UI Service,我想要传统的纯HTML / JS。因此,我在页面上呈现我的UI,在iframe中打开电子表格,然后我的UI将Google Scripts称为服务,这意味着我将脚本部署为Web应用程序(自动执行不同的电子表格任务)并使用URL参数调用它们。它工作正常,除了我无法获得有效范围/选择,这是我的应用程序的交易破坏。
答案 0 :(得分:1)
嗯,因为你的观察是正确的,我害怕你不能。
但是,如果您在主电子表格中使用第二个工作表,并且onEdit()
触发器监视主工作表中的活动单元格,则可能存在解决方法。
然后外部webApp可以非常简单地轮询第二张表上的值。
以下是电子表格中的(简单)代码:
function onEdit(event){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = event.source.getActiveSheet();
var r = event.source.getActiveRange();
// if(sh.getName()!='main sheet'){return};
ss.toast('hi = '+r.getA1Notation()+'/'+sh.getName()+' value='+r.getValue());
var tracker = ss.getSheetByName('tracker sheet');
tracker.getRange(tracker.getLastRow()+1,1).setValue(r.getA1Notation());
Browser.msgBox('new')
}
一个简单的webApp,显示如下结果:
function doGet(){
var targetId = '0AnqSFd3iikE3dFRqUFVMSjdiSU9EV1pGcG1hQ3FlT1E'
var sh = SpreadsheetApp.openById(targetId).getSheetByName('tracker sheet');
var cell = sh.getRange(sh.getLastRow(),1).getValue();
var html ="<!DOCTYPE html><body>Active Cell in your sheet is "+cell+"</body></html>";
return HtmlService.createHtmlOutput(html).setTitle('onEdit result')
}
test sheet is here(带有“主要工作表”,您可以在其上书写,“跟踪工作表”包含A1表示法)和附加到其上的网络工具is here
我添加了一个“toast”来监视onEdit函数,仅用于测试目的