我有一个计划者类型的Google电子表格,其中每天有8-10个用户添加数据。当我向单元格添加日期时,我希望格式化该日期之后同一行中的所有单元格,并添加诸如“ ENDED”之类的文本值。
目前,我正在使用条件格式并使用ArrayFormula添加文本值。问题在于,要使ArrayFormula正常工作,这些单元格必须为空,而在我的工作表中,它们可能包含“ ENDED”日期单元格之前的数据。
是否可以使用脚本来执行此操作?....,如果脚本还可以处理单元格的格式,那将是最佳解决方案。
这是我的示例文件,可以更好地了解我要做什么...
答案 0 :(得分:0)
您可以使用触发器和自定义功能来完成此操作。
创建一个新的apps脚本项目并使用以下代码:
function onEdit(e) {
if (e.range.getColumn() ==2) {
//User edited the date column
if (typeof e.range.getValue() === typeof new Date()) {
//Value of edit was a date
endColumns(e.range.getRow(), e.range.getValue());
} else if (e.range.getValue() === "" || e.range.getValue() === null) {
var sheets = SpreadsheetApp.getActiveSheet();
var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn()+1, 1, sheets.getMaxColumns()-e.range.getColumn());
resetRange.clear(); //Will delete all text, not only the "ENDED" text.
}
}
}
function endColumns(rowNum, limitDate) {
var sheets = SpreadsheetApp.getActiveSheet();
var colOffset = 3; //Offset to account for your row Headers
var dateHeader = sheets.getRange(1, colOffset, 1, sheets.getMaxColumns()-colOffset);
var availableDates = dateHeader.getValues()[0];
var foundCol = 0;
for (var i=0; i<availableDates.length; i++) {
if (availableDates[i]>=limitDate) {
break;
}
foundCol++;
}
var rewriteCells = sheets.getRange(rowNum, foundCol+colOffset, 1, sheets.getMaxColumns()-(foundCol+colOffset));
//Add your formatting and text below:
rewriteCells.setValue("Ended");
rewriteCells.setBackground("red");
rewriteCells.setFontColor("yellow");
//Clear all cells that are "white" (no header)
for (var i=0; i<availableDates.length; i++) {
if (availableDates[i]==="" || availableDates[i] ===null) {
sheets.getRange(rowNum, colOffset+i).clear();
}
}
}
然后,创建触发器以在每次编辑时运行onEdit
函数。
在这种情况下,有一些硬编码的值:
e.range.getColumn() == 2
用于添加日期的行var colOffset = 3
了解在读取日期之前要跳过的列数希望这会有所帮助!