开发者社区 问答 正文

如何设置关闭onEdit(e)函数的范围?

我想在特定条件下将时间戳记写入不同的列。该功能应在范围内执行。我想将第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();

我究竟做错了什么?

function onEdit(e) {

var timezone = "GMT+2"; var timestamp_format = "HH:mm:ss"; var updateColName = "Letzte Prüfung"; var updateColName1 = "Watchlist"; 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 = SpreadsheetApp.getActiveRange(); var editColumn = actRng.getColumn(); var index = actRng.getRowIndex(); var headers = sheet.getRange(13, 8).getValues(); 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(new Date(), timezone, timestamp_format); cell.setValue(date); }

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(new Date(), timezone, timestamp_format); cell.setValue(date); }

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

}

展开
收起
被纵养的懒猫 2019-10-09 16:55:58 458 分享 版权
阿里云 AI 助理回答

您的代码中存在几个问题,我将逐一指出并提供修改建议。首先,您需要确保正确地获取列标题,并且在检查输入的列时要使用正确的条件逻辑。以下是根据您的需求调整后的代码示例:

function onEdit(e) {
  var timezone = "GMT+2";
  var timestamp_format = "HH:mm:ss";
  var updateColName = "Letzte Prüfung"; // Check for input in column 8 or 9
  var updateColName2 = "Watchlist";      // Check for input in column 16
  var timeStampColName = "Letzte Änderung"; // Column to write timestamp if condition in column 8 or 9 is met
  var timeStampColName2 = "Letzte Änderung 2"; // Column to write timestamp if condition in column 16 is met
  var now = new Date();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Tickerprüfung');
  
  // Ensure the edit occurred within the intended range and fetch headers correctly
  var row = e.range.getRow();
  var col = e.range.getColumn();
  if(row < 14 || (col !== 8 && col !== 9 && col !== 16)) return; // Only act if it's from row 14 onwards and in the specified columns
  
  var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0]; // Fetch all headers in row 13

  // Determine which timestamp column to use based on edited column
  var targetColName;
  if(col === 8 || col === 9) {
    targetColName = timeStampColName;
  } else if(col === 16) {
    targetColName = timeStampColName2;
  } else {
    return; // If not editing the watched columns, do nothing
  }
  
  var targetColIndex = headers.indexOf(targetColName);
  
  // Write timestamp if the target column index was found
  if(targetColIndex > -1) {
    sheet.getRange(row, targetColIndex).setValue Utilities.formatDate(now, timezone, timestamp_format));
  }
}

这段代码做了以下修改和优化: 1. 使用e.range.getRow()e.range.getColumn()直接从事件对象获取编辑的行和列,这样可以确保只对符合条件的单元格作出响应。 2. 改进了获取所有列标题的方式,现在它会获取第13行的所有列标题。 3. 根据编辑的列(8、9或16)来决定写入时间戳的目标列名。 4. 确保只有当编辑发生在指定的行和列时,才执行写入时间戳的操作。 5. 使用Utilities.formatDate函数格式化时间戳为所需的"HH:mm:ss"格式。

请尝试使用此修改后的代码,并注意检查是否满足您的具体需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: