我是应用程序脚本的新手,通常是脚本。这就是为什么我在这里注册的原因(我已经阅读了一个月)。
我需要在带有应用程序脚本的Google表中制作时间戳。我的函数检查,如果B列中的任何行具有特定的值(字符串),则它将在同一行中打印在K列中的时间戳。
so:在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中的时间戳?
例如。B4和B8在K4和K8中使用" DONE" -> TIMESTAMP同时udpe。现在,您将b5设置为"锁定" -> k4和k8中的时间戳。
我不知道,如果这很简单,或者我不明白的东西。这很难,因为该函数必须检查其值的每一行,因为B中可以有多个行,可以同时更新。谁能帮忙?
以下是更新的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();
}
}
}
}