我想在特定条件下将时间戳记写入不同的列。该功能应在范围内执行。我想将第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); }
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您的代码中存在几个问题,我将逐一指出并提供修改建议。首先,您需要确保正确地获取列标题,并且在检查输入的列时要使用正确的条件逻辑。以下是根据您的需求调整后的代码示例:
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"格式。
请尝试使用此修改后的代码,并注意检查是否满足您的具体需求。