【问题标题】:TypeError: Cannot read property "source" from undefined [duplicate]TypeError:无法从未定义的 [重复] 中读取属性“源”
【发布时间】:2017-03-10 09:05:01
【问题描述】:

我已经在论坛中搜索了几次,但无法找到我的问题的答案。

我正在使用 Google 表格来跟踪我的团队的项目进度。我目前有 5 个用户,每个用户都有自己的选项卡,以及三个额外的选项卡,这些选项卡旨在动态化,但对除我自己以外的任何用户都相当放手。

为了使这个跟踪器易于使用,我实现了一个 onEdit 脚本,以将任何标记为“已完成”的项目从用户选项卡自动移动到“已完成”选项卡。

该脚本在我前几次测试时运行良好,但现在我遇到了这个错误:

TypeError:无法从未定义中读取属性“源”。 (第 7 行)

我不完全确定为什么脚本无法找到源代码,所以我不确定我需要在我的代码中修复什么。

function onEdit(event) {
  // assumes source data in sheets named Laura, Jedsen, Erin, Tim, Hunter
  // target sheet of move to named Completed
  // test column with completed is col 11 or K
  // must create new script when adding in a new writer
  var ss = SpreadsheetApp.getActiveSheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Laura" && r.getColumn() == 11 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
  if(s.getName() == "Jedsen" && r.getColumn() == 11 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
   if(s.getName() == "Erin" && r.getColumn() == 11 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
   if(s.getName() == "Hunter" && r.getColumn() == 11 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
   if(s.getName() == "Tim" && r.getColumn() == 11 && r.getValue() == "Completed") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Completed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

【问题讨论】:

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


    【解决方案1】:

    看起来您正在从脚本编辑器运行该函数。在这种情况下,event 未定义。要了解如何测试触发功能,请参阅How can I test a trigger function in GAS?

    【讨论】:

    • 谢谢鲁本!看起来我的脚本现在运行得很好。
    • @LauraMantzoros:谢谢你告诉我。如果您发现自己如何修复脚本,请将您的解决方案作为答案发布。
    【解决方案2】:

    我在我的应用程序脚本中遇到了一些类似的异常,但在我的例子中,有一个愚蠢的错误,我在调用方法时忘记传递变量引用

    function validate(name) {
      if (!codeConstants[name]) {
        Logger.log('Error:' + name);
      }
    }
    
    function init(name) {
      if (!validate())
        return;
    
      // some code....
    }
    

    我的验证方法调用有问题,应该改为

    if (!validate(name))

    【讨论】:

      【解决方案3】:

      我认为这对你有用,

      var ss = SpreadsheetApp.getActiveSheet();
      var s = ss.getActiveSheet();
      var r = s.getActiveRange();
      

      让我知道它是否有效。

      【讨论】:

      • @tehhowch 非常感谢,我只是一个尝试学习新事物的初学者。
      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 2015-05-08
      • 2014-09-07
      • 2017-12-15
      • 1970-01-01
      • 2018-12-20
      • 2019-08-19
      • 2017-07-09
      相关资源
      最近更新 更多