TypeError:无法读取属性" source"来自undefined

时间:2016-10-27 15:31:19

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

我已经在论坛上搜索了几次,但我无法解决我的问题。

我使用Google表格跟踪我的团队的项目进度。我目前有5个用户,每个用户都有自己的标签,还有三个额外的标签,除了我自己以外,对于任何用户来说都是动态的。

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

在我测试它的前几次脚本工作正常,但现在我遇到了这个错误:

  

TypeError:无法读取属性" source"来自undefined。 (第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);
  }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我在我的app脚本中遇到了一些类似的异常,但在我的情况下,有一个愚蠢的错误,我忘记了在调用方法时传递变量引用

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

function init(name) {
  if (!validate())
    return;

  // some code....
}

我的验证方法调用遇到了麻烦,应将其更改为

  

if(!validate(name))

答案 2 :(得分:-1)

我认为这对你有用,

LocationManager locMan = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        assert locMan != null;
        long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();

让我知道它是否有效。