【问题标题】:TypeError: Cannot read property '0' of undefined (line 54, file "Code")TypeError:无法读取未定义的属性“0”(第 54 行,文件“代码”)
【发布时间】:2020-07-09 12:20:14
【问题描述】:

我被困在这里了。我已经阅读了几个解决方案,但仍然无法找出问题所在。怎么办?

    function sendPDFForm()
        {
          var row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();
          sendEmailWithAttachment(row);
        }
    
function sendEmailWithAttachment(row)
{
  var filename= 'Poster-CoV-WS-E1-merged.pdf';
  ...
}
    
    function getClientInfo(row)
    {
       var sheet = SpreadsheetApp.getActive().getSheetByName('test');
       if (sheet != null) {
          var values = sheet.getRange('A2:B4').getValues();
         //var values = sheet.getRange(row,1,row,3).getValues();
         var rec = values[0];
       }
      var client = 
          {
            first_name: rec[0],
            email: rec[1]
          };
      client.name = client.first_name;
      return client;
    }
    
    function sendFormToAll()
    {
       var sheet = SpreadsheetApp.getActive().getSheetByName('test');
      
       var last_row = sheet.getDataRange().getLastRow();
      
       for(var row=2; row <= last_row; row++)
       {
         sendEmailWithAttachment(row);
         sheet.getRange(row,4).setValue("email sent");
       }
    }
     

这里我已经分享了完整的代码。运行时它只显示错误内联 54

【问题讨论】:

  • 错误不在这里。它可能在其他地方或sheetnull(工作表名称正确吗?)=>recundefined
  • 是的,表名是正确的,它只是测试
  • 第54行是哪一行?
  • 名:rec[0],
  • 那么工作表名称是错误的。测试另一个名称或显示Logger.log(sheet)的结果

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


【解决方案1】:

错误说明

你需要学会阅读错误信息,否则以后会很困难。消息指出:

TypeError:无法读取未定义的属性“0”(第 54 行,文件“代码”)

我们来解析一下消息的含义:

  1. 这是一个与原始值 undefined 相关的 TypeError
  2. 正在运行的脚本尝试从undefined 访问名为0 的属性
  3. 导致错误的指令位于第 54 行,文件“Code.gs”

现在,“尝试访问”意味着您指示脚本在对象上调用 property accessor。由于该消息引用了属性0,因此您很可能尝试通过index 访问数组中的元素,您这样做了:rec[0]

当您得到TypeError 时,您希望rec 是一个数组,但变量却持有undefined。您将rec 变量(顺便说一句,请参见下面的第1 点)初始化为values[0],并将values 初始化为调用getValues() 的结果。

因为getValues 总是 返回值的二维数组,所以这不是问题。然后,正如已经指出的那样,唯一的其他选择是永远不会到达 if 语句块,这意味着 sheet != nullfalse

sheet != null 的唯一原因是,如果找不到工作表,getSheetByName() 会返回 null。这是一个重现错误的小样本:

function MCVE(testValue) {
  
  if(testValue != null) {
    var test = "not null";
  };
  
  test || console.log("Expected test to be defined");
}

MCVE(null);

优化点

  1. 永远不要使用变量out of scope。您的 rec 变量在 if 语句中声明,但在语句之外访问。
  2. 继续在语句或函数声明的同一行打开{。 JavaScript 为您做了很多假设,所以有一天您可能会错过解释器决定在您的 if 语句之后放置一个 ;...
  3. 看在上帝的份上,不要在循环中使用 I/O(输入/输出)操作(请参阅 setValue 在您的 for 循环中) - 它们很慢,在 Google 表格中它们是 非常 慢,请改用setValues()(并将getRange() 移出循环)。
  4. 除非您知道自己在做什么,否则请使用 strict comparison (=== / !==)。 99% 的时间使用严格比较会教您注意正确使用类型并避免令人沮丧的错误。例如:

const nonStrict = false == "0";
const strict = false === "0";

nonStrict && console.log("non-strict comparison evaluated to true");
strict || console.log("strict comparison evaluated to false");
false || console.log("false is falsy");
"0" && console.log("but non-empty string is truthy");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多