谷歌电子表格SCRIPT检查编辑细胞是在特定的范围内(Google Spreadsheet SCRI

2019-06-18 07:04发布

我需要检测是否正在一定范围的数据内进行到电子表格的更改,如果是,设置当前更新时间。

问题是,我有编辑上的标题和文字,我不希望在一个特定的细胞更新时间到电子表格进行更新,但是当我在一个单元格范围内编辑的数据,我想更新电子表格时间改变。

这是我必须更新的时间。

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

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

我只希望在G10,如果我编辑某些细胞(在范围“B4:J6”)设置日期

Answer 1:

有一个事件作为参数传递给你提供onEdit()函数,它包含了编辑的内容所需的信息。 如果你想知道这是什么(e)是一回事,这是它。

由于一个onEdit()函数被调用每一个编辑,你应该确定你是否应该退出投资尽可能少的处理成为可能。 通过使用在传递的事件,您将需要更少的服务电话,这样效率会更高。 该拉斯穆斯答案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"
} ​


Answer 2:

最简单的方法是命名您的触发范围

通过命名你的“触发器”的范围,那么你不必乱用脚本一旦你设置的脚本中的区域名称。 通过简单的编辑标准的谷歌表界面中的命名范围的范围内,脚本仍将即使你扩大或减少范围的大小工作。

第1步:命名你的范围

命名的单元格范围你有兴趣充当触发您的脚本,你应该在你的范围内编辑任何单元格按这里的说明: https://support.google.com/docs/answer/63175

我叫我的范围“triggerRange”。

第2步:编辑范围名称为以下脚本:

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
  }
}


Answer 3:

你可以简单地检查是否该范围内发生的修改事件。

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
  }
}

我承认这是很详细,但我还没有发现范围ALA range.contains一个简单的方法(范围)



Answer 4:

只是快速修复可能出现的问题由拉斯穆斯以前的答案:

在线路:

var rangeRowEnd = rangeRowStart + range.getHeight();
var rangeColEnd = rangeColStart + range.getWidth();

它是增加(实际上它不是减去初始行和列这将导致更大的范围比由1行1列整体预计就在同一行中减去1:

var rangeRowEnd = rangeRowStart + range.getHeight()-1;
var rangeColEnd = rangeColStart + range.getWidth()-1;

通过拉斯穆斯Fuglsnag和校正代码应该是这样的:

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()-1;
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth()-1;
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd)
  {
    // Do your magic here
  }
}

由于拉斯穆斯Fuglsnag提供这样做最简单的方法。 我不相信有一个更好更简单的方式通过代码来做到这一点。



Answer 5:

如果你想要的代码非常少的线,你可以使用:

function onEdit(){
  var cell = SpreadsheetApp.getActive().getActiveCell();
  var row = cell.getRow();
  var col = cell.getColumn();

  //if col > A && col < K ...
  if(col > 1 && col < 11 && row > 3 && row < 7){ //B4:J6
    //do something
  }

然而,改变的范围可以采取比其他方法长一点。



文章来源: Google Spreadsheet SCRIPT Check if edited cell is in a specific range