检查列标题标题是否与字符串匹配,如果匹配,则返回列索引

时间:2019-07-16 14:08:51

标签: javascript google-apps-script google-sheets

我正在尝试为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的下一个单元格中输出日期。

如何更改代码以查找列标题=“已回复”的位置?而不是索引?

3 个答案:

答案 0 :(得分:2)

目标:

如果满足以下条件:

  • 将值写入第19列(S)。
  • 第19列(S)的标题为“已答复?”。
  • 写入的值是“ Y”或“ y”。

然后将日期写到相邻的单元格中。


代码:

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

基本上:

  • 在Google表格中打开电子表格。
  • 选择要命名的单元格。
  • 单击数据,然后单击命名范围。菜单将在右侧打开。
  • 键入所需的范围名称。
  • 要更改范围,请单击“电子表格网格”。
  • 在电子表格中选择一个范围,或在文本框中输入新范围,然后-单击“确定”。
  • 点击完成。

然后您可以通过创建自定义函数来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"));}
}

您还可以考虑使用复选框,这对于您的用户而言可能更快。