【问题标题】:What is wrong with this Google Scripts code regarding last modified date for Google Sheets?关于 Google 表格的最后修改日期,此 Google 脚本代码有什么问题?
【发布时间】:2021-05-12 05:52:08
【问题描述】:

我是一个完整的初学者,只是想制作一个我的家人可以用来进行预算的界面。我唯一苦苦挣扎的是某些单元格的最后修改日期的自动化。每当我将代码作为附加组件运行时,即使我将代码输入到第 10、11、15 列等中,它也只会按照第一条语句中的指定修改第 7 列。似乎忽略了其他“else if”语句。

function onEdit(e) {
  var row = e.range.getRow();
  var col = e.range.getColumn();
  
  if(col === 5,6 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,7).setValue(new Date());
  } 
  else if(col === 10,11 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,12).setValue(new Date());
  } 
  else if(col === 15,16 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,17).setValue(new Date());
  } 
  else if(col === 20,21 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,22).setValue(new Date());
  } 
  else if(col === 25,26 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,27).setValue(new Date());
  } 
  else if(col === 30,31 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,32).setValue(new Date());
  } 
  else if(col === 35,36 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,37).setValue(new Date());
  } 
  else if(col === 40,41 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,42).setValue(new Date());
  } 
  else if(col === 45,46 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,47).setValue(new Date());
  } 
  else if(col === 50,51 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,52).setValue(new Date());
  } 
  else if(col === 55,56 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,57).setValue(new Date());
  } 
  else if(col === 60,61 && row > 3 && e.source.getActiveSheet().getName() === "2021" ){
    e.source.getActiveSheet().getRange(row,62).setValue(new Date());
  } 
}

【问题讨论】:

  • 我很惊讶它甚至做了一些事情,因为col === 5,6 肯定不会做你期望它做的事情。也许你的意思是(col ===5 || col === 6)

标签: javascript datetime if-statement google-apps-script google-sheets


【解决方案1】:
function onEdit(e) {
  const sh = e.range.getSheet();
  const cA1 = [5,6,10,11,15,16,20,21,25,26,30,31,35,36,40,41,45,46,50,51,55,56,60,61]
  const cA2 = [7,7,12,12,17,17,22,22,27,27,32,32,37,37,42,42,47,47,52,52,57,57,62,62]
  const idx = cA1.indexOf(e.range.columnStart);
  if( sh.getName() == "2021" && e.range.rowStart>3 && ~idx ) {
    sh.getRange(e.range.rowStart, cA2[idx] ).setValue(new Date());
  }
}

【讨论】:

  • 非常感谢!我真的不明白,但它有效!
  • 我也不是很明白。我只是想弄清楚你想做什么。你可能想看看comma operator,我承认这有点神秘,但我认为你在想or,但事实并非如此。 onEdit 触发功能可能很难开始工作。如果您通过从另一个函数运行来提供事件对象,则可以运行它们。但我通常通过编辑工作表并使用 Spreadsheet.toast() 并将事件日志写入其中一个单元格来运行它们。
  • ~ 是一个值得学习的有趣运算符,因为很多时候我想用 indexOf() 获取索引并同时检查逻辑,但我不想运行indexOf() 方法两次,因为 onEdit 简单触发函数必须在 30 秒或更短时间内完成,因此每个函数调用都对您不利。
【解决方案2】:
if ( col === 5,6 ) {
    ...
}

等价于

if ( 6 ) {
    ...
}

if 语句始终为真,因为 6 是一个真值

var col = 1; // Let's take 1 for example

if ( col === 5,6 ) {
  console.log( 'Matches first if condition' );
}

if ( 6 ) {
  console.log( 'Matches second if condition' );
}

if ( col === 5 ) {
  console.log( 'Matches third if condition' );
}

要检查给定的数字是否在数字列表中,您可以:

  1. 分别比较
if ( ( col === 5 || col === 6 ) && /* the rest of your logic here */ ) {
    ...
}
  1. 将数字放入Array,并找到与indexOf匹配的数字,以便您以后添加更多想要轻松匹配的列号
if ( [ 5, 6 ].indexOf( col ) !== -1 && /* the rest of your logic here */ ) {
    ...
}

此外,您不必在每个 if 语句中进行 row > 3 && e.source.getActiveSheet().getName() === "2021" 检查。检查一次并继续检查匹配的列

var row         = e.range.getRow();
var col         = e.range.getColumn();
var activeSheet = e.source.getActiveSheet();
var currentDate = new Date();

if ( row > 3 && e.source.getActiveSheet().getName() === "2021" ) {
    if ( col === 5 || col === 6 ) {
        activeSheet.getRange( row, 7 ).setValue( currentDate );
    }

    if ( col === 10 || col === 11 ) {
        activeSheet.getRange( row, 12 ).setValue( currentDate );
    }

    ...
}

【讨论】:

  • 成功了!感谢您的详尽解释。
【解决方案3】:

另一种缩短代码和删除重复字符串的方法

function onEdit(e) {
      var row = e.range.getRow(),
          col = e.range.getColumn(),
          arrOfCols = [5,10,15,20,25,30,35,40,45,50,55,60];
    
      if (row > 3 && e.source.getActiveSheet().getName() === "2021") {
        if (arrOfCols.indexOf(col)>-1) e.range.offset(0,2).setValue(new Date());   
        if (arrOfCols.indexOf(col-1)>-1) e.range.offset(0,1).setValue(new Date())
      }
    }

if (arrOfCols.indexOf(col)>-1) - 此条件将检查当前列是否在 arrOfCols 列列表中 (5,10,15,20,25,30,35,40,45,50,55,60) -如果yes,则向右偏移两列并写入时间戳e.range.offset(0,2).setValue(new Date())

'if (arrOfCols.indexOf(col-1)>-1)' - 此条件将检查当前列是否在 arrOfCols 列列表中 (6,11,16,21,26,31, 36,41,46,51,56,61) - 如果,则向右偏移一列并写入时间戳e.range.offset(0,1).setValue(new Date())

【讨论】:

  • 另一种方法是使用循环for (let i=5; i<65; i+=5),然后使用ii+1i+2 作为其他值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2019-07-25
  • 2019-06-09
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多