无法使Google脚本正常运行

时间:2014-03-13 00:53:27

标签: google-apps-script google-sheets

我是谷歌脚本的新手。我找到了应该有效的东西,但没有。我搜索过,但无法找到解决方案。

我找到的脚本:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("My Sheet name");
  var statusValues = sheet.getRange("D:D").getValues();
  var dateValues = sheet.getRange("E:E").getValues();
  for (var row in statusValues) {
    if (statusValues[row] != "Yes" && dateValues[row] == "") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 17).setValue(new Date());
    } 
  }
};

当D中的单元格显示Yes(在同一行)时,应该自动在E列中应用编辑日期。当我调试它时,我得到:

TypeError: Cannot call method "getRange" of null. (line 5, file "Code")*

我的D列是一个下拉菜单,其中包含空白/是/否选项。这可能是为什么?此外,它不会显示在我的云端硬盘中。我读到了应该发生的地方。

3 个答案:

答案 0 :(得分:2)

不确定您是否解决了所有问题,但我想我会分享我的解决方案。

我们的团队有多个电子表格,用于记录最后一个用户编辑行,以及该行最后两列的编辑日期。

首先我有一个masterOnEdit(e)函数,如下所示:

function masterOnEdit(e) { 

  // Get active spreadsheet and row information
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = e.source.getActiveCell().getRow();
  var col = e.source.getActiveCell().getColumn();

  // Set last updated and user cells if not editing those cells
  if (row > 3 && col < (sheet.getLastColumn()-2)) {
    setLastUpdated(sheet);
  }
}

此函数忽略前三行(我的标题行)并忽略对最后两列的编辑(如果您想手动添加用户/日期)。

此函数还调用一个名为setLastUpdated(sheet)的函数。请注意,我将工作表变量传递给此子功能以限制Google API调用。真正的编辑在这里进行:

function setLastUpdated(sheet){
  var row = sheet.getActiveCell().getRow();
  var email = Session.getActiveUser().getEmail();
  var user = parseUser(email);
  var userCell = sheet.getRange(row, sheet.getLastColumn()-1)
  userCell.setValue(user.name);
  userCell.setBackground(user.color);

  var date = Utilities.formatDate(new Date(), "GMT-5", "h:mm a   M/d/yy");
  sheet.getRange(row, sheet.getLastColumn()).setValue(date);
}

此代码块中的另一个子函数解析用户名。此功能接收谷歌返回的电子邮件,并使用正则表达式将其解析为我们的团队名称。这也允许我根据哪个团队成员进行编辑来设置用户单元格的颜色。

function parseUser(email) {
  var user = {name: email, color:'#FFFFFF'}
  if (/peter/.test(email)){
    user.name = 'Peter';
    user.color = '#4585F1';
  }
}

希望这会有所帮助。我基于我在网上找到的一些最完整的例子构建了这个。真正帮助我们的团队跟踪正在处理电子表格工作流程的人员。

答案 1 :(得分:1)

试试这段代码:
请勿忘记更改工作表名称的“我的工作表名称”

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("My Sheet name"); // don't forget to change by your sheet name
  var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient
  for (var row in statusValues) {
    if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote
    } 
  }
};

答案 2 :(得分:0)

最后,在经历了很多围绕@Harold的帮助之后,我得到了这个工作。 仅供参考我有一张桌子,其中E记录D drop菜单设置为YES的日期,如果我将D更改为其他任何内容,则E中的此日期将被删除。 F和G的运行相同。

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("MySheet"); // don't forget to change by your sheet name
  var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient
  var statusValues2 = sheet.getRange("F:G").getValues();


  for (var row in statusValues) {
    if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote
    } 
      if (statusValues[row][0] != "Yes" && statusValues[row][1] != "Date") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 5).setValue(""); // "5" is the column where the date is wrote
    } 
  }

  for (var row in statusValues2) {
    if (statusValues2[row][0] == "Yes" && statusValues2[row][1] == "") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 7).setValue(new Date()); 
    } 
      if (statusValues2[row][0] != "Yes" && statusValues2[row][1] != "Date") {
      var num = parseInt(row) + 1;
      sheet.getRange(num, 7).setValue("");
    } 
  }
};

任何有关精简这一点的建议仍然受到欢迎。