当前位置: 首页 > 知识库问答 >
问题:

谷歌电子表格脚本检查编辑的单元格是否在特定范围内

聂琨
2023-03-14

我需要检测对电子表格所做的更改是否在特定数据范围内进行,如果是,请设置当前更新时间

问题是,我有一个可以编辑标题和文本的电子表格,我不希望在电子表格上更新特定单元格中的更新时间,但当我编辑一系列单元格中的数据时,我确实希望更改更新时间。

以下是我必须更新的时间。

function onEdit(e) 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  ss.getRange("G10").setValue(new Date());
} ​

如果我编辑某些单元格(在B4: J6范围内),我只希望G10中的日期设置

共有3个答案

萧亦
2023-03-14

您只需检查编辑事件是否发生在范围内。

function onEdit(e)
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var range = sheet.getRange("B4:J6");
  var rangeRowStart = range.getRow();
  var rangeRowEnd = rangeRowStart + range.getHeight();
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth();
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd)
  {
    // Do your magic here
  }
}

我承认这是非常冗长的,但我仍然没有找到一个简单的方法范围alarange.contains(范围)

漆雕成弘
2023-03-14

通过命名您的“触发器”范围,一旦您在脚本中设置了范围名称,您就不必弄乱脚本了。通过简单地在标准的谷歌工作表界面中编辑你的命名范围的范围,即使你扩大或缩小范围的大小,脚本仍然可以工作。

如果您按照此处的说明编辑区域中的任何单元格,请将您感兴趣的单元格区域命名为脚本的触发器:https://support.google.com/docs/answer/63175

我把我的范围命名为“triggerRange”。

function onEdit(e) {
      var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here inside the getRange() function.
      //SpreadsheetApp.getUi().alert("myRange in A1 Notation is: " + myRange.getA1Notation()); //If you're having problems, uncomment this to make sure your named range is properly defined

      //Let's get the row & column indexes of the active cell
      var row = e.range.getRow();
      var col = e.range.getColumn();
      //SpreadsheetApp.getUi().alert('The Active Cell Row is ' + row + ' and the Column is ' + col); //uncomment this out to do testing

      //Check that your active cell is within your named range
      if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range
        SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here
      } else {
        SpreadsheetApp.getUi().alert('You Edited a Cell OUTSIDE the Range!');//Comment this out or insert code if you want to do something if the edited cells AREN'T inside your named range
        return;
      }
    }

PS:感谢其他海报为这个基本脚本提供了基本框架。显然,我已经对脚本进行了大量的注释,因此您可以轻松地对其进行测试。删除我在脚本中创建的警报,以获得更清晰的外观。。。或者只是复制并粘贴以下内容:

function onEdit(e) {
  var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here

  //Let's get the row & column indexes of the active cell
  var row = e.range.getRow();
  var col = e.range.getColumn();

  //Check that your active cell is within your named range
  if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range
    SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here
  }
}
郎曜文
2023-03-14

有一个事件作为参数提供给您的onEdit()函数,它包含了编辑内容的必要信息。如果你想知道(e)是关于什么的,这就是。

由于每次编辑都会调用onEdit()函数,因此在决定是否退出时,您应该尽可能少地进行处理。通过使用传入的事件,您将需要更少的服务调用,从而提高效率。如果需要灵活,Rasmus的答案将A1表示法转换为列和行号的方法是很好的,但是如果编辑范围是固定的,您可以简单地使用常量值进行比较——同样,减少所需的处理时间。

function onEdit(e) 
{
  var editRange = { // B4:J6
    top : 4,
    bottom : 6,
    left : 2,
    right : 10
  };

  // Exit if we're out of range
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;

  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;

  // We're in range; timestamp the edit
  var ss = e.range.getSheet();
  ss.getRange(thisRow,7)   // "G" is column 7
    .setValue(new Date()); // Set time of edit in "G"
} ​
 类似资料:
  • 如果某个事件(编辑单元格)发生在工作表的特定范围内(不是所有工作表),我想用OneEdit触发一个触发器吗?示例:我只想在编辑活页_1中名为“trgRng”(C10:C250)范围的单元格时触发。 我编码如下,但它触发所有的工作表,而不仅仅是特定范围的特定工作表 可能吗?怎样

  • 试图复制整个电子表格,但我想没有api可以这样做。 基本上,我正在尝试做以下工作: 有一个电子表格,我想对其进行小的更改。 创建一个新的电子表格,将模板中的所有表格逐个复制到新的电子表格中(电子表格复制会更有效率) 创建新的电子表格工作正常,但从电子表格复制表格不起作用。 尝试了两种方法: 角: 给出以下错误: 对飞行前请求的响应未通过访问控制检查:无“访问控制允许原点” Google Sheet

  • 我不熟悉谷歌电子表格功能,并尝试以以下方式应用公式: 我有一张床单 我想链接工作表2中的范围数据 现在需要考虑的是,它只显示了一个项目(最后一个),而这个范围本来应该显示十个项目(a1:a10) 有关更正上述公式的详细信息和帮助,请查看以下链接: https://docs.google.com/spreadsheets/d/1HX1eatP57A5k9Xku7awIVnBPQ2A4ICVrYXTs

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd

  • 我有一个谷歌电子表格,我用它创建了一个谷歌表单。电子表格有两张表:一张有表单响应,另一张有配置数据。电子表格附带了一个表单响应触发的应用程序脚本,该脚本使用配置数据进行API调用。这个脚本运行完全符合我的要求。 我已经编写了电子表格更改触发脚本,试图更新表单问题之一的选项。但是,使用FormApp。openById或FormApp。openByUrl因“您无权调用…”而失败。 是否有某种方法可以将

  • 我正试图让一个Google表单根据1个表单输入的数据,用多行填充电子表格,如下所示: 表单简单,客户信息最少https://docs.google.com/forms/d/1LrKlVuI7kxVU0lxz70Uu-2Obj4x3qIwe6nS-ErzbCAg/ 输入后,我需要表格在表格(或格式化表格)中输入数据,如下所示:-输入的每个部分(1、2或3)应位于单独的行中,具有相同的客户名称 然后,