【问题标题】:Google Sheets Scripts onOpen(e) Add New Row to SheetGoogle 表格脚本 onOpen(e) 将新行添加到表格
【发布时间】:2018-05-01 07:03:25
【问题描述】:

我有一个自定义函数,它在工作表的最后一个非空行下插入一个新行,并将特定范围复制到这个新行。当我使用自定义菜单项触发此功能时,此功能可以正常工作。

但是,当我将此自定义函数添加到 onOpen(e) 触发器时,脚本不起作用。我进行了故障排除并在我的函数中添加了一个警报 - 警报触发,因此该函数在正确的位置被读取。

请告知如何让我的脚本在打开时运行?

这是我的自定义函数的代码:

function onOpen(e) {
  autoAddRow();
}

function autoAddRow() { 
  var updateFrequency = 3;
  var lRow = getLastRow('A'); 
  var lDate = all.getRange(lRow,1).getValue();  
  var today = new Date();

  Date.prototype.addDays = function(days) {
    var dat = new Date(this.valueOf());
    dat.setDate(dat.getDate() + days);
    return dat;
  }
  var newDate = lDate.addDays(updateFrequency);

  if (today >= newDate) {
    var lCol = all.getLastColumn();
    var src = all.getRange(3,1,1,6);
    var dest = all.getRange(lRow+1,1,1,6);

    if(lRow > 20) {
      all.insertRowsAfter(lRow, 1);
    }

    src.copyTo(dest, {contentsOnly:false});
  } else {
    return;
  }
}

【问题讨论】:

  • 打开电子表格,然后进入脚本编辑器并使用查看 > 日志查看执行期间发生的情况。可能是无效的范围或会停止执行的调用。
  • 在脚本编辑器中运行您的代码。它将识别出许多您可以处理的错误。

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


【解决方案1】:

因此,如果您的示例不是伪代码,它将无法工作。它死在函数的第二行,因为该方法没有附加到一个类。

这是我的代码版本(我使用的是电子表格应用程序中的第一张工作表)。

function autoAddRow() { 
  var updateFrequency = 3

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var data = sheet.getDataRange();  
  var lRow = data.getLastRow();
  var lDate = new Date(sheet.getRange(lRow,1).getValue());
  var today = new Date();
  Logger.log(lDate);
  Logger.log(lRow);
  Logger.log(sheet.getRange(lRow,1).getValue());

  Date.prototype.addDays = function(days) {
    var dat = new Date(this.valueOf());
    dat.setDate(dat.getDate() + days);
    return dat;
  }
  var newDate = lDate.addDays(updateFrequency);

  if (today >= newDate) {
    Logger.log("passed if statement");
    var lCol = data.getLastColumn();
    var src = sheet.getRange(lRow,1,1,6);
    var dest = sheet.getRange(lRow+1,1,1,6);

    if(lRow > 20) {
      all.insertRowsAfter(lRow, 1);
    }

    src.copyTo(dest, {contentsOnly:false});
  } else {
    return;
  }
}

主要问题在于对范围和数据的调用。他们哪儿也没去。变量 lDate 需要被解析为日期(在我的版本中,我的日期列是第二列,而不是第一列 *编辑:快速更改代码以指向原始日期单元格 *结束编辑),但您必须调用范围并获取解析它的值,但是在解决了关于获取数据的类问题之后,其余的就到位了。如果您放入 onOpen,它甚至可以工作。

更新:我没有修复这条线

if(lRow > 20) {
  all.insertRowsAfter(lRow, 1);
}

事实上,我不太确定它做了什么,因为它看起来只是在最后一行之后插入行,而函数的其余部分就是这样做的。但是除非您更改“全部”以引用工作表对象,否则代码“原样”将在 20 行后中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2017-11-25
    相关资源
    最近更新 更多