我一般都是应用程序脚本和脚本的新手。这就是我在这里报名的原因(我现在已经读了一个月)。
我需要在带有应用脚本的Google工作表中制作时间戳。 我的函数检查,如果列B中的任何行具有特定值(字符串),如果是,则它在同一行的列K中打印时间戳。
所以:在B3中出现"完成"并且时间戳以K3打印。 但是有一种情况,当B4和B8得到价值"完成"同时,例如因为它取决于工作表中的其他一些单元格。然后,时间戳同时打印在K4和K8中。
我得到了以下功能,并且工作正常:
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("plan");
var state = ss.getRange("B3:B").getValues();
var time = new Date();
for (var row in state) {
var rowNum = parseInt(row) +1;
if (hasStatus(state[row] == "Done")) {
ss.getRange(rowNum + 2, 11).setValue(time);
}
else if ((hasStatus(state[row] == "open") || hasStatus(state[row] == "nothing to do") || hasStatus(state[row] == "locked")))
{
ss.getRange(rowNum + 2, 11).clearContent();
//Browser.msgBox(state);
}
}
}
function hasStatus(state){
return state;
}
因此,如果您将B4设置为打开或锁定,则会删除K4列中的内容。但它在每次编辑时都会更新K3:K中的时间戳(因为它每次都会遍历整个列)。 如果只编辑了一行,如何阻止此函数更新K3:K中的时间戳?
E.g。 B4和B8同时使用"完成" - > K4和K8中的时间戳。 现在你将B5设置为"锁定" - > K4和K8中的时间戳不会更改/更新。
我不知道,如果它只是简单的,或者是否有我不理解的东西。 这很难,因为函数必须检查每一行的值,因为B中可以有多行可以同时更新。 有人可以帮忙吗?
答案 0 :(得分:0)
此处更新的onEdit
函数仅检查已更改的行:
function onEdit(e) {
var time = new Date();
// column B
var statusColNum = 2;
// column K
var timestampColNum = 11;
// get changed range data
var range = e.range;
var rangeCol = range.getColumn();
var rangeRow = range.getRow();
var rangeWidth = range.getWidth();
var rangeHeight = range.getHeight();
// check if needed sheet was edited
var curSheet = range.getSheet();
var curSheetName = curSheet.getName();
if (curSheetName != 'plan') {
return;
}
// check that current changes are in column B
if (statusColNum < rangeCol || statusColNum > rangeCol + rangeWidth - 1) {
return;
}
// loop changed rows
for (var i = 0; i < rangeHeight; i++) {
var statusCell = curSheet.getRange(rangeRow+i, statusColNum);
var statusCellVal = statusCell.getDisplayValue();
var timestampCell = curSheet.getRange(rangeRow+i, timestampColNum);
var timestampCellVal = timestampCell.getDisplayValue();
if (statusCellVal == "Done") {
// do not update cell if already have needed value
if (timestampCellVal != time) {
timestampCell.setValue(time);
}
}
else if (["open", "nothing to do", "locked"].indexOf(statusCellVal) !== -1) {
// do not update cell if already have needed value
if (timestampCellVal !== '') {
timestampCell.clearContent();
}
}
}
}