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

时间:2020-07-08 16:29:15

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

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

    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");
       }
    }
     

enter image description here

在这里,我分享了完整的代码。运行它时,它仅显示错误内联54

1 个答案:

答案 0 :(得分:2)

错误说明

您需要学习阅读错误消息,否则前进将非常困难。消息指出:

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

让我们解析消息的含义:

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

现在,“尝试访问”意味着您已指示脚本在对象上调用property accessor。由于该消息指向属性0,因此您可能试图通过其 index 来访问数组中的 ,您这样做:{{1 }}。

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

因为getValues 总是返回一个二维值数组,所以这不是问题。然后,正如已经指出的,唯一的选择是永远不会到达getValues()语句块,这意味着ifsheet != null

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

null

优化点

  1. 切勿使用变量out of scope。您的function MCVE(testValue) { if(testValue != null) { var test = "not null"; }; test || console.log("Expected test to be defined"); } MCVE(null);变量在rec语句中声明,但在该语句之外访问。
  2. 继续在语句或函数声明的同一行上打开if。 JavaScript为您提供了很多帮助,因此有一天您可能会错过解释器,因为它决定在您的{语句后加上; ...
  3. 不要为了上帝的爱而在循环中使用I / O(输入/输出)操作(请参阅if循环中的setValue)-它们很慢,而在Google表格中它们却是< em>非常很慢,请改用for(也将setValues()移出循环)。
  4. 除非您知道自己在做什么,否则请使用strict comparisongetRange() / ===)。 99%的时间使用严格比较会教您注意正确使用类型,并避免令人沮丧的错误。例如:

!==