当新数据添加到另一个单元格时,如何自动填充当前日期?
How do you autofill Current Date when New Data is Added to another Cell?
所以我在论坛上四处查看,我不敢相信没有人问过这个问题,我相信你们中的一些人可能也想知道这个。
所以肯定有关于自动日期填充的问题,但是,我发现的几乎 100% 的脚本都没有做我正在寻找的事情,所以这就是问题所在。
所以问题:当另一个单元格已填充时,如何将一个单元格自动填充到当前日期?但...
总是遗漏一件事......如果同一列中有多个单元格被填充,你如何获得日期来填充相同数量的行?
我遇到的问题是,当我在工作时试图创建一些传播sheets,是这个日期问题。我希望能够获取一批数据,填充一个单元格或任何我想指定脚本的单元格,而不是让列 A 只为一批数据填充一个日期。我必须将许多信息粘贴到 sheet 中,我不想手动将 A 列中的每个单元格填充到当前日期。
这是我的脚本,请告诉我如何修改它。
我正在使用此脚本处理的列是日期的 A 列,我正在填充 E 列。
示例图片:
var COLUMNTOCHECK = 5;
var DATETIMELOCATION = [0,-4];
var SHEETNAME = 'Appraisers'
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
if( sheet.getSheetName() == SHEETNAME ) {
var selectedCell = ss.getActiveCell();
if( selectedCell.getColumn() == COLUMNTOCHECK) {
var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[1]);
dateTimeCell.setValue(new Date());
}
}
}
您的代码本身没有问题。它工作得很好。但正如@TheMaster 所说,您应该阅读 OnEdit 触发器中的 e
变量,因为它 returns 有多个 "event objects" and these are described in detail in the Trigger documentation。
这是值得的,因为您会知道 OnEdit
在您 编辑 数据时有效,而不是在您 copy/paste 时有效。但有一个解决方法。
e.range
对象会告诉您 copy/paste 发生的范围。您可以通过 运行 一个简单的记录器命令对其进行测试:
Logger.log("e range = "+e.range.getA1Notation());
通过使用该范围,我们可以计算范围内的起始行和行数,因此循环可以创建偏移值。
试试这个代码。
归功于
中的 Cooper
function so_53471920(e) {
// set up the spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// set up some key variables
var COLUMNTOCHECK = 5;
var DATETIMELOCATION = [0, -4];
var SHEETNAME = "Appraisers";
var adjustdate = new(Date);
// return the edited range from OnEdit
var myrange = e.range;
// get the starting row, starting column, range depth in the range and name of the active sheet
var startRow = e.range.getRow();
var startColumn = e.range.getColumn();
var rowdepth = e.range.getNumRows();
var activeSheet = e.source.getActiveSheet().getName();
// Logger.log("1=e.range = "+e.range.getA1Notation());// DEBUG
// Logger.log("2=starting column in e.range = "+startColumn);// DEBUG
// Logger.log("3=starting row in e.range = "+startRow);// DEBUG
// Logger.log("4=Number of rows in e.range = "+rowdepth);// DEBUG
// Logger.log("5=The sheet name is "+activeSheet);
// test the sheet and column
// Note: getColumn returns the starting column position for this range; so this works only if the left hand paste column is "E"
if (activeSheet !== SHEETNAME || startColumn !== COLUMNTOCHECK) {
// quit if this isn't the right sheet or column
Logger.log("system quit");
return;
} else {
// loop through the number of rows in the pasted range
// getNumRows returns the number of rows in this range.
//Logger.log("start row="+startRow+", target i = "+(startRow+rowdepth)); //DEBUG
for (var i = startRow; i < (startRow + rowdepth); i++) {
// i = the row number
// Logger.log("Updated row A"+i);//DFEBUG
e.source.getActiveSheet().getRange("A" + i).setValue(adjustdate);
}
}
}
所以我在论坛上四处查看,我不敢相信没有人问过这个问题,我相信你们中的一些人可能也想知道这个。
所以肯定有关于自动日期填充的问题,但是,我发现的几乎 100% 的脚本都没有做我正在寻找的事情,所以这就是问题所在。
所以问题:当另一个单元格已填充时,如何将一个单元格自动填充到当前日期?但... 总是遗漏一件事......如果同一列中有多个单元格被填充,你如何获得日期来填充相同数量的行?
我遇到的问题是,当我在工作时试图创建一些传播sheets,是这个日期问题。我希望能够获取一批数据,填充一个单元格或任何我想指定脚本的单元格,而不是让列 A 只为一批数据填充一个日期。我必须将许多信息粘贴到 sheet 中,我不想手动将 A 列中的每个单元格填充到当前日期。
这是我的脚本,请告诉我如何修改它。 我正在使用此脚本处理的列是日期的 A 列,我正在填充 E 列。
示例图片:
var COLUMNTOCHECK = 5;
var DATETIMELOCATION = [0,-4];
var SHEETNAME = 'Appraisers'
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
if( sheet.getSheetName() == SHEETNAME ) {
var selectedCell = ss.getActiveCell();
if( selectedCell.getColumn() == COLUMNTOCHECK) {
var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[1]);
dateTimeCell.setValue(new Date());
}
}
}
您的代码本身没有问题。它工作得很好。但正如@TheMaster 所说,您应该阅读 OnEdit 触发器中的 e
变量,因为它 returns 有多个 "event objects" and these are described in detail in the Trigger documentation。
这是值得的,因为您会知道 OnEdit
在您 编辑 数据时有效,而不是在您 copy/paste 时有效。但有一个解决方法。
e.range
对象会告诉您 copy/paste 发生的范围。您可以通过 运行 一个简单的记录器命令对其进行测试:
Logger.log("e range = "+e.range.getA1Notation());
通过使用该范围,我们可以计算范围内的起始行和行数,因此循环可以创建偏移值。
试试这个代码。
归功于
function so_53471920(e) {
// set up the spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// set up some key variables
var COLUMNTOCHECK = 5;
var DATETIMELOCATION = [0, -4];
var SHEETNAME = "Appraisers";
var adjustdate = new(Date);
// return the edited range from OnEdit
var myrange = e.range;
// get the starting row, starting column, range depth in the range and name of the active sheet
var startRow = e.range.getRow();
var startColumn = e.range.getColumn();
var rowdepth = e.range.getNumRows();
var activeSheet = e.source.getActiveSheet().getName();
// Logger.log("1=e.range = "+e.range.getA1Notation());// DEBUG
// Logger.log("2=starting column in e.range = "+startColumn);// DEBUG
// Logger.log("3=starting row in e.range = "+startRow);// DEBUG
// Logger.log("4=Number of rows in e.range = "+rowdepth);// DEBUG
// Logger.log("5=The sheet name is "+activeSheet);
// test the sheet and column
// Note: getColumn returns the starting column position for this range; so this works only if the left hand paste column is "E"
if (activeSheet !== SHEETNAME || startColumn !== COLUMNTOCHECK) {
// quit if this isn't the right sheet or column
Logger.log("system quit");
return;
} else {
// loop through the number of rows in the pasted range
// getNumRows returns the number of rows in this range.
//Logger.log("start row="+startRow+", target i = "+(startRow+rowdepth)); //DEBUG
for (var i = startRow; i < (startRow + rowdepth); i++) {
// i = the row number
// Logger.log("Updated row A"+i);//DFEBUG
e.source.getActiveSheet().getRange("A" + i).setValue(adjustdate);
}
}
}