0

我发现 getActiveRange()、getActiveSelection() 等函数仅在脚本作为电子表格中的自定义函数或容器扩展运行时才起作用(请参阅脚本的执行方法)。我的观察正确吗?有没有办法将脚本部署为 Web 应用程序,使用SpreadsheetApp.openById()打开电子表格并获得活动范围/选择,假设电子表格的所有者已在 Drive 中打开它?

问题是我正在为 Google 电子表格进行扩展,但是为了构建我的自定义 UI,我不想使用Html ServiceUI Service,我想要传统的纯 HTML/JS。因此,我在页面上呈现我的 UI,我在 iframe 中打开电子表格,然后我的 UI 将 Google Scripts 调用为服务,这意味着我将脚本部署为 Web 应用程序(自动执行不同的电子表格任务)并使用 URL 参数调用它们。它工作正常,但我无法获得活动范围/选择,这对我的应用程序来说是一个交易破坏者。

4

1 回答 1

3

好吧,恐怕您不能,因为您的观察是正确的。

但是,如果您在主电子表格中使用第二张工作表和一个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')
}

一个测试表在这里(带有一个你可以写的“主表”和一个包含 A1 符号的“跟踪表”)并且附加到它的 webapp在这里

我添加了一个“toast”来监控 onEdit 功能,仅用于测试目的

于 2013-01-03T18:43:49.737 回答