google-apps-script - 在一行的第一个空白单元格中设置时间戳
问题描述
每次选择 col8 中的单元格时,我都会尝试在电子表格中做两件事。第一次增加 col7 中单元格的值,并在该行的第一个空白单元格中设置时间戳。我卡在时间戳上。增加值有效,我可以将时间戳设置为特定单元格,如代码中所示或工作表的最后一列中所示,但我找不到将其设置在行的第一个空白单元格中的解决方案。
function onSelectionChange(e) {
const as = e.source.getActiveSheet();
const col = e.range.getColumn();
const row = e.range.getRow();
if (as.getName() == 'Sheet1' && col == 8){
const range = as.getRange(row,7);
range.setValue(range.getValue()+1);
e.range.setValue('Present');
}
onEdit(e);
}
function onEdit(e) {
var attendanceSheet = e.source.getActiveSheet();
var row = e.range.getRow();
var col = e.range.getColumn();
if(attendanceSheet.getName() == 'Sheet1' && col == 8) {
if (attendanceSheet.getRange(row, 12).getValue() === '')
attendanceSheet.getRange(row, 12).setValue(new Date());
}
}
解决方案
恕我直言,从函数(另一个简单的可安装触发器)调用onEdit
函数(一个简单的可安装触发器)是一个非常糟糕的主意,onSelectionChange
因为在某些情况下,可能会在选择更改发生后立即进行编辑。
如果您希望避免在两个简单触发器上重复时间戳代码,则将时间戳代码“提升”为一个函数并从两个触发器中调用它。
function onSelectionChange(){
// Some code here
timestamping();
}
function onEdit(){
// Some code here
timestamping();
}
function timestamping() {
// timestamping code here
}
关于在一行中的第一个空白单元格中设置时间戳,使用indexOf
你可能会得到列,你可能会使用这样的东西:
var sheet = e.range.getSheet();
/** Get the edited row values */
var rowValues = sheet.getRange(e.range.rowStart,1,1,sheet.getLastColumn()).getValues()[0];
/** Get the column of first empty cell */
var column = rowValues.indexOf('') + 1;
/** First evaluate if there was found and empty cell, if so, add the timestamp, otherwsie do nothing */
if(column > 0) attendanceSheet.getRange(row, column).setValue(new Date());
推荐阅读
- javascript - 如何在 ES6 中选择不为空的对象的特定属性?
- ios - 如何在 UICollectionViewFlowLayout 中为两列居中按钮?是否有更有效的方法来解决这个问题?
- asciidoc - 如何在 AsciiDoc 中为图形添加空白标题
- css - 带伪元素的css设置渐变图片背景
- python - PySpark:在多列中计算值的最快方法
- php - 使用队列发送邮件时忽略区域设置
- mysql - 灵活地将小时数四舍五入到上四分之一
- react-native - 当水平不显示任何内容时反应原生嵌套滚动视图
- macos - 使用 hdiutil 将 Mojave Mac OS dmg 转换为 UDTO 失败
- python - Python中的grpc proto版本控制