我正在尝试为Google表格编写脚本,当用户在当前单元格中输入“ y”时,该脚本将在下一个单元格中返回日期。我有一个已经执行此操作的脚本,但是我脚本的问题在于它正在评估的列基于列索引,这意味着如果我们的数据集不断增长,则这些列必须始终保留在相同的索引中,造成了很多组织问题。
我的问题是..
是否可以在代码中查找列标题而不是列索引?如果是,我需要进行哪些更改?
function onEdit(e) {
if ([19].indexOf(e.range.columnStart) == -1 || ['y', 'Y'].indexOf(e.value) == -1) return;
e.range.offset(0, 1)
.setValue(Utilities.formatDate(new Date(), "GMT-5", "MM-dd-yyyy"))
}
此代码当前查看列索引19,当在列索引19的单元格中输入“ y”或“ Y”时,它将在列20的下一个单元格中输出日期。
如何更改代码以查找列标题=“已回复”的位置?而不是索引?
答案 0 :(得分:2)
如果满足以下条件:
然后将日期写到相邻的单元格中。
function onEdit(e) {
var sh = e.source.getActiveSheet();
var row = e.range.getRow();
var col = e.range.getColumn();
var value = e.value.toUpperCase();
var header = sh.getRange(1, col).getValue();
if (col === 19 && value === 'Y' && header === 'Replied?') {
sh.getRange(row, 20).setValue(Utilities.formatDate(new Date(), "GMT-5", "MM-dd-yyyy"))
}
}
我一切都基于传递给您的onEdit
触发器的事件对象。对于var value
,我使用了toUpperCase()
,因此我们不必检查“ Y”或“ y”,仅检查“ Y”即可。另外,我没有使用range.offset
,而是在getRange().setValue()
中专门指定了第20列。
答案 1 :(得分:0)
一种可行的方法是在Google表格中命名列/单元格。有关如何操作,请参见this website。
基本上:
然后您可以通过创建自定义函数来refer to that named cell in google scripts
function myGetRangeByName(n) { // just a wrapper
return SpreadsheetApp.getActiveSpreadsheet().getRangeByName(n).getA1Notation();
}
然后,在电子表格的单元格中:
myGetRangeByName("Names")
答案 2 :(得分:0)
我会这样做。
function onEdit(e) {
var editedColumn = e.range.columnStart;
var sh = SpreadsheetApp.getActiveSpreadsheet();
var ss = sh.getSheetByName("This");//you only want onedits to the specific page
var data = ss.getDataRange().getValues();
var header = data[0][editedColumn];
if (header != "Replied") return;
if(e.value.toLowerCase() == "y"){
e.range.offset(0, 1)
.setValue(Utilities.formatDate(new Date(), "GMT-5", "MM-dd-yyyy"));}
}
您还可以考虑使用复选框,这对于您的用户而言可能更快。