Google apps script 当脚本部署为Web应用程序时,如何在Google电子表格中获取活动范围/选择?

Google apps script 当脚本部署为Web应用程序时,如何在Google电子表格中获取活动范围/选择?,google-apps-script,google-sheets,google-spreadsheet-api,Google Apps Script,Google Sheets,Google Spreadsheet Api,我发现getActiveRange()、getActiveSelection()等函数只有在脚本作为电子表格或容器扩展中的自定义函数运行时才起作用(请参阅)。我的观察正确吗?是否有任何方法可以将脚本部署为Web应用程序,使用打开电子表格并获取活动范围/选择,前提是电子表格的所有者已在驱动器中打开它 问题是,我正在为Google电子表格做一个扩展,但是为了构建我的自定义UI,我不想使用,或者,我想要传统的纯HTML/JS。因此,我在页面上呈现我的UI,在iframe中打开一个电子表格,然后我的UI

我发现getActiveRange()、getActiveSelection()等函数只有在脚本作为电子表格或容器扩展中的自定义函数运行时才起作用(请参阅)。我的观察正确吗?是否有任何方法可以将脚本部署为Web应用程序,使用打开电子表格并获取活动范围/选择,前提是电子表格的所有者已在驱动器中打开它


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

由于您的观察是正确的,恐怕您不能

但是,如果在主电子表格中使用第二个工作表和监视主工作表中活动单元格的
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')
}
函数doGet(){
var targetId='0ANQSFD3IIKE3DFRQUFVMSJDISU9EV1PGG1HQ3FLT1E'
var sh=SpreadsheetApp.openById(targetId).getSheetByName('tracker sheet');
var cell=sh.getRange(sh.getLastRow(),1.getValue();
var html=“工作表中的活动单元格为“+单元格+”;
返回HtmlService.createHtmlOutput(html).setTitle('OneEdit结果')
}
A(带有一张可以书写的“主工作表”和一张带有A1符号的“跟踪器工作表”)及其附带的webapp


我添加了一个“toast”来监视onEdit函数,仅用于测试目的

谢谢Serge!不幸的是,onEdit不适合我,我需要像onSelectionChanged这样的东西。。。是否可以从我的webApp在测试表中触发自定义函数?我在GAS中不知道(因为您提到的执行方法)。也许其他人会提出一些建议,但这超出了我的知识范围。。。sorry@xman85您的意思是在Web应用程序的某些组件(例如列表框)发生更改后,在电子表格中执行某些操作(例如更改单元格的值)?您可以向组件(lstbx)添加带有changehandler的serverclickhandler,然后在web应用程序脚本的电子表格中使用相同的功能。(这将与copy paste&SpreadsheetApp.openById()一起更新,以使用html服务并保留所有onEdit单元格位置的列表,只是为了好玩;)