【问题标题】:How the set a closer range for an onEdit (e) function?如何为 onEdit (e) 函数设置更近的范围?
【发布时间】:2019-10-09 23:49:30
【问题描述】:

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

它应该是这样工作的:

时间戳 1

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

时间戳 2

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

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

如果我将范围扩展到整个表格,在第一行写入列标题(参见: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);
      }
      }

}

【问题讨论】:

  • 能否分享电子表格的屏幕截图?
  • 以上截图。

标签: google-apps-script google-sheets


【解决方案1】:

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

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

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

如果你想获取所有的行值,你应该这样做:

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

【讨论】:

  • 谢谢,这可行,但现在我遇到了另一个问题。当标题行或标题行上方的单元格被编辑时,标题会被覆盖,并且上面的单元格也会被时间戳覆盖。如何确保标题行和标题行上方的范围得到保护?
【解决方案2】:

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

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

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

希望这会有所帮助!

【讨论】:

  • 不幸的是,根据您建议的更改,我没有得到任何时间戳。可能是我做错了什么。我将根据您的建议添加编辑后的代码。
  • 您好@Dpei,您必须在使用某些内容初始化值 editColumn 后进行 if 检查。将其放在var editColumn = actRng.getColumn(); 行之后。
  • 对不起,我的错误。我误读了你的代码。我已更新我的建议以反映正确的解决方案。
  • 我更改了上面的代码,但我仍然没有在我的目标列中获得任何时间戳...还有其他想法吗?
  • @Dpei 您能否创建电子表格的公开副本并将其链接到您的问题中?这样我就可以复制您的问题并确定问题所在。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多