如何为onEdit(e)函数设置更近的范围?

时间:2019-10-09 08:50:03

标签: google-apps-script google-sheets

我想在特定条件下将时间戳记写入不同的列。该功能应在范围内执行。我想将第13行用作标题行。

这是应该如何工作的:

时间戳1

如果在第14行的第8列或第9列中对单元格进行了编辑,则应在第10列的同一行中写入定义的时间戳(“ HH:MM:SS”)。

时间戳2

如果在第14行的第16列中编辑单元格,则应在第18列的同一行中写入时间戳。

enter image description here

为此,我使用下面的代码。不幸的是,这行不通。

如果将范围扩展到整个表,请在第一行中编写列标题(请参见:updateColName,timeStampColName),并按如下所示定义“ Header”变量,然后代码即可工作。

var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();

我在做什么错了?

链接到工作表行减少的公共版本。

https://docs.google.com/spreadsheets/d/1otiQjBbQBUhAlULau0FR3wQYT0jvm8jJLNqnGYNMBoY/edit?usp=sharing

    function onEdit(e)
{ 

    var timezone = "GMT+2";
    var timestamp_format = "HH:mm:ss";
    var updateColName = "Watchlist";
    var updateColName1 = "Letzte Prüfung";
    var updateColName2 = "Entry Datum"; 
    var timeStampColName = "Letzte Änderung";
    var timeStampColName1 = "Letzte Änderung 2";
    var now = new Date()
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName('Tickerprüfung');
    var actRng = e.range;
    var editColumn = actRng.getColumn();
    var index = actRng.getRowIndex();
      if (index>13) { 
    var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());

    //Checks if column I has been edited and then writes a timestamp to column K in the same line
    var dateCol = headers[0].indexOf(timeStampColName);
    var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) {
        var cell = sheet.getRange(index, dateCol + 1);
        var date = Utilities.formatDate(now, timezone, timestamp_format);
            cell.setValue(date);
      }

    //Checks if column J has been edited and then writes a timestamp to column K in the same line  
    var dateCol = headers[0].indexOf(timeStampColName);
    var updateCol = headers[0].indexOf(updateColName1); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) {
      var cell = sheet.getRange(index, dateCol + 1);
      var date = Utilities.formatDate(now, timezone, timestamp_format);
          cell.setValue(date);
      }

    //Checks if column Q has been edited and then writes a timestamp to column S in the same line
    var dateCol = headers[0].indexOf(timeStampColName1);
    var updateCol = headers[0].indexOf(updateColName2); updateCol = updateCol+1;

      if (dateCol > -1 && index > 1 && editColumn == updateCol) { 
      var cell = sheet.getRange(index, dateCol + 1);
          cell.setValue(now);
      }
      }

}

2 个答案:

答案 0 :(得分:2)

我认为您以错误的方式声明了标头:

var headers = sheet.getRange(13, 8).getValues();

这仅捕获单元格H13(第13行,第8列)上的值

如果要获取所有行值,则应执行以下操作:

var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());

答案 1 :(得分:0)

您的函数似乎有一些小错误。

要修复它们,请执行以下操作:

  1. var headers = sheet.getRange(13, 8).getValues();更改为var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());
  2. Utilities.formatDate(new Date(), timezone, timestamp_format);更改为Utilities.formatDate(now, timezone, timestamp_format);。无需创建新的Date()对象。
  3. 使用e事件对象检测当前更改。将var actRng = SpreadsheetApp.getActiveRange();更改为var actRng = e.range;
  4. 在开始处添加检查以确认是否要更改标题下方的内容:
var index = actRng.getRowIndex();
if (index>13) {
  //rest of the code   
}

最终解决方案:

将代码更改为:

function onEdit(e)
{ 
  var timezone = "GMT+2";
  var timestamp_format = "HH:mm:ss";

  var updateColName = "Watchlist";
  var updateColName1 = "Letzte Prüfung";
  var updateColName2 = "Entry Datum"; 
  var timeStampColName = "Letzte Änderung";
  var timeStampColName1 = "Letzte Änderung 2";

  var now = new Date();
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getSheetByName('Tickerprüfung');

  var actRng = e.range;
  var editColumn = actRng.getColumn()-1;
  var index = actRng.getRowIndex();
  Logger.log(actRng);

  if (index>=13) { 
    var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0];
    var cell;
    if (editColumn === headers.indexOf(updateColName) || editColumn === headers.indexOf(updateColName1)) {
      //Checks if column I has been edited and then writes a timestamp to column K in the same line
      //Checks if column J has been edited and then writes a timestamp to column K in the same line  
      cell = sheet.getRange(index, headers.indexOf(timeStampColName)+1);
    } else if (editColumn == headers.indexOf(updateColName2)) {
      //Checks if column Q has been edited and then writes a timestamp to column S in the same line
      var cell = sheet.getRange(index, headers.indexOf(timeStampColName1)+1);
    } else {
      return;
    }
    cell.setValue(Utilities.formatDate(now, timezone, timestamp_format));
  }
}

希望这会有所帮助!