首页 > 解决方案 > Excel 中是否有类似 Application.Intersect(Target, Range) 的谷歌脚本方法?

问题描述

现在我明白这个问题更深了,并且与事件的跟踪有关。

在 Excel 中,我使用以下代码:

If Not Intersect(Target, Sh.Range("$A$1:$A$300")) Is Nothing sub_do_something()

这里,Target - 选中单元格的地址,Intersect判断单元格是否属于指定范围。

我在系统中使用它来填写和计算项目的成本。

用户单击计算模板的特定部分中的一行。该脚本确定所选单元格的地址并将用户切换到目录的特定工作表。接下来,用户单击所需的目录行,脚本复制该行中一定范围的单元格并将用户返回到计算中。发生这种情况时,复制的数据会插入到一系列单元格中,从选定的单元格开始。

因此,创建一个可以有超过 100 个位置的计算被大大简化了。

在 Excel 中,一切正常,但很快我计划将此项目转移到基于云的服务,而 Google 表格是最佳选择。

唉,在 GAS 中只能跟踪某些事件,例如,使用 onOpen 或 onEdit 触发器。Excel 有更多的跟踪事件

在 StackOverflow 上搜索后,我发现了几个与跟踪事件相关的类似问题,例如,如何在 Document-bound script 中找到用户光标的位置我们能否实现一些在谷歌文档中选择某些内容时触发的代码?谷歌应用脚​​本监控电子表格选定范围

从这些问题的答案可以看出,在 GAS 中并没有 Excel 中的 Intersect(Target, Range) 这样简单的解决方案。最后一个示例使用侧面菜单,从中运行脚本,每秒查询工作表 5 次,并在“数据”字段中显示活动单元格的地址。

不幸的是,这段代码对我不起作用。在调试器中,getActiveRange() 函数工作正常,但这段代码不起作用:

$(document).ready(() => {
   setInterval(()=>{
   google.script.run.withSuccessHandler(log).getActiveRange();
   },200)    
  })       
  log(e) => {
    $('#data').val(e)
  }

问题。

如果有人做过类似的事情,请分享您的经验。或者告诉我为什么这个例子不起作用。如果他能复活,我会让他适应我的任务。

标签: excelvbagoogle-apps-scriptgoogle-sheets

解决方案


我从事过一个类似的项目,这是解决方案:

function onSelectionChange(e)
{
  var ss = e.source;
  var Sh = ss.getActiveSheet();
  var range = Sh.getRange("A1:A300");
  var target = e.source.getActiveRange();

  //check for intersection
  if(RangeIntersects(target, range))
  {
    Logger.log("Changed Row: " + target.getRow() + "\nValue: " + target.getValue());
  }
}

//returns true if target intersects with the predefined range
function RangeIntersects(target, range)
{
  return (target.getLastRow() >= range.getRow()) && (range.getLastRow() >= target.getRow()) && (target.getLastColumn() >= range.getColumn()) && (range.getLastColumn() >= target.getColumn());
}


推荐阅读