我有一个包含多列的电子表格。当任何列更新时,我需要它来更新第 5 列(即我们的时间戳列)上的时间戳:
https://docs.google.com/spreadsheets/d/1zOKwPL0LMtWpcbhji6XDi-8Sx3-WfxRXnboZ_Le0wZo/edit?usp=sharing
但我一生都无法弄清楚为什么它不起作用。
尝试来自 stackexchange
的答案function onEdit() {
var s = SpreadsheetApp.getActiveSheet();
if( s.getName() == "Sheet1" ) { //checks that we're on the correct sheet
var r = s.getActiveCell();
if( r.getColumn() == 13 ) { //checks the column
var nextCell = r.offset(0, 1);
if( nextCell.getValue() === '' ) //is empty?
var time = new Date();
time = Utilities.formatDate(time, "GMT", "HH:mm:ss");
nextCell.setValue(time);
};
};
}
您可以尝试添加 Google Apps 脚本来捕获编辑单元格的时间,并向不同的单元格添加时间戳
经过一些小的编辑并删除切片器后,您当前的脚本将可以工作(将时间戳放入列
I
)
if (r.getColumn() < 9 && ss.getName()=='Sheet1') { // 2. If Edit is done in any column before Column (I) And sheet name is Sheet1 then:
至:
if (r.getColumn() < 9 && ss.getName()=='Sheet 1') { // 2. If Edit is done in any column before Column (I) And sheet name is Sheet1 then:
Legacy editor
并单击脚本编辑器上方菜单中的
File > Project properties > Time Zone
来更改应用程序脚本的时区。
File > Spreadsheet settings
const sh = SpreadsheetApp.getActiveSheet();
const SHEETNAME = 'Sheet 1'; // SHEET to MONITOR
const COLTSL = 'E'; // COLUMN LETTER to TIMESTAMP
function onEdit(e) {
let r = sh.getActiveCell();
// If Edit is done in any column other than the timestamp column, And sheet name is Sheet 1 then:
if (r.getColumn() !== COLTSL && sh.getName() == SHEETNAME) {
let celladdress = COLTSL + r.getRowIndex()
sh.getRange(celladdress).setValue(new Date()).setNumberFormat("dd/MM/yyyy hh:mm");
}
}
但是,这仍然存在限制,即当您启用切片器时,setValue 将无法正常工作(某些行有效,其他行无效)。
我的案例的一些
背景:
function timestamp() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const totalSheet = ss.getSheets();
for (let a=1; a<totalSheet.length; a++) {
let sheet = ss.getSheets()[a];
let range = sheet.getDataRange();
let values = range.getValues();
function autoCount() {
let rowCount;
for (let i = 0; i < values.length; i++) {
rowCount = i
if (values[i][0] === '') {
break;
}
}
return rowCount
}
rowNum = autoCount()
for(let j=1; j<rowNum+1; j++){
if (sheet.getRange(j+1,7).getValue() === '') {
sheet.getRange(j+1,7).setValue(new Date()).setNumberFormat("yyyy-MM-dd hh:mm:ss");
}
}
}
}
解释
const totalSheet
制作了一个
getSheets()
并运行它 带有
for
循环。即识别总张数 在该电子表格内。请注意,在这里,我做了
let a=1;
假设所有 JavaScript 都一样,以
0
开头,值
1
是跳过第一张纸并从第二张纸开始运行
let sheet = ss.getSheets()[a]
循环内。请注意,如果变量中的值不断变化
,所以使用
const
反而可以正常工作。
然后,你会看到一个
let
function autoCount()
循环来计算其中已编辑值的行数。这
for
是导航脚本进行搜索 浏览整个有价值的工作表,查看行
if (values[i][0] === '')
并 列
i
。这里,
0
表示的是第第一列
工作表,
0
是工作表的行。是的,它的工作原理就像
i
具有
json
感觉的物体。
然后,您可以通过运行以下命令找到编辑的行数
panda
autoCount()
变量来包含结果。
然后,将
rowNum
rowNum
循环中,并使用
for
来确定哪一行 尚未使用时间戳进行编辑。请注意,此处的
if (sheeet.getRange(j+1,7).getValue() === '')
指示工作表的第7列
是我想要的地方 时间戳。在
7
for
指定日期 格式为
setValue
。您可以自由编辑任何内容 喜欢的风格
ohya,请记住部署以激活事件类型的触发器 如
("yyyy-MM-dd hh:mm:ss")
。这是它的外观的屏幕截图:
最后,在决定是否使用适用于您的案例的解决方案之前,请注意我的一些背景。干杯,祝编码愉快~!
不再需要脚本: