【问题标题】:google-apps-script cannot read array value ("typeError: "cannot read property "1" ) [duplicate]google-apps-script 无法读取数组值(“typeError:”无法读取属性“1”)[重复]
【发布时间】:2021-01-06 05:14:19
【问题描述】:

我正在尝试通过参考我的谷歌表格数据让我的代码发送电子邮件。我正在使用 Apps 脚本,这是代码。然而,当我运行我的函数“sendEmail()”时,我得到了“typeError:”cannot read property “1” of undefined(line 17)”。

代码行 17

var currentEmail = rows[i][1];

这是完整的代码。

var ss = "1kuTkOuCd-wKTS2564oHdxALFbFo-IeyjzToYYhB6NrQ";
var SheetName = "FormResp";

function getRows(){
  var rangeName = 'FormResp!A2:E'; 
  var rows = Sheets.Spreadsheets.Values.get(ss, rangeName).values;
  return rows;
}

function sendEmails() {
  var ss_1 = SpreadsheetApp.openById(ss);
  var sheet = ss_1.getSheetByName(SheetName);
  var lr = sheet.getLastRow();
  
  for (var i = 0;i<=lr;i++){
    rows=getRows();
    var currentEmail = rows[i][1];
    var startingdate = rows[i][3];
    var endingdate = rows[i][4];
    MailApp.sendEmail(currentEmail,"Thank You for Applying Leave via Leave form: your request leave starting" + startingdate + "until" + endingdate,"Hello");
    
  }
  
}


function testgetrow(){
  var nama = getRows();
  var x = ""; 
}

我确实创建了一个测试函数“testgetrow()”来检查我的数据,并且我确实设法运行该函数而没有任何错误,并且我确实确认我的 getRows() 函数中有值。

我的 getRows() 函数正常工作,数组中有一个值,如下图所示。

【问题讨论】:

  • 这个for (var i = 0;i&lt;=lr;i++)应该是for (var i = 0;i&lt;lr;i++)
  • 使用像A2:E 这样的范围是个问题,因为你最终会在底部有很多空行,必须过滤掉。

标签: javascript google-apps-script


【解决方案1】:

我想你可以随心所欲地做,但这对我来说似乎要简单得多。

function sendEmails() {
  const ss = SpreadsheetApp.openById("1kuTkOuCd-wKTS2564oHdxALFbFo-IeyjzToYYhB6NrQ");
  const sh = ss.getSheetByName('FormResp');
  const rg = sh.getRange(2,1,sh.getLastRow()-1,5);
  const vs=rg.getValues(); 
  vs.forEach(r=>{  
    var currentEmail = r[1];
    var startingdate = r[3];
    var endingdate = r[4];
    MailApp.sendEmail(currentEmail,"Thank You for Applying Leave via Leave form: your request leave starting" + startingdate + "until" + endingdate,"Hello");
  });
}

【讨论】:

    【解决方案2】:

    回答

    主要问题是您没有在第 16 行 rows=getRows(); 中正确声明变量 rows,因为您忘记使用关键字 var。将该行更改为 var rows = getRows(),然后重试。

    看看

    • 您将SpreadsheetAppSheets API 混合在一起。我建议您选择一个并留在那里以获得清晰且不那么混乱的代码。
    • 如果不是真的需要,请尝试使用较少的函数,正如@Cooper 建议的那样,您可以定义变量rowsgetRange,它可以处理A1 notation rangesgetValues
    • A1 notation 中正确定义range:如果你写A2:E,你的range 从列A,行2 直到列E,行1000。您必须在range 中添加最后一行的编号,例如A2:E10
    • 使用最后的更改,您不必计算最后一行,只需使用rows.length
    • 如果您的脚本是Container-bound Scripts 而不是Standalone ScriptgetActiveSpreadsheet,则不必拥有spreadsheetid

    我附上代码的sn-p:

    var sheetName = "FormResp";
    var spreadsheet_id = "1kuTkOuCd-wKTS2564oHdxALFbFo-IeyjzToYYhB6NrQ";
    var ss = SpreadsheetApp.openById(spreadsheet_id).getSheetByName(sheetName)
    
    function sendEmails() {
      var rangeName = 'A1:B9'; 
      var rows = ss.getRange(rangeName).getValues()
      for (var i = 0; i <= rows.length; i++){
        var currentEmail = rows[i][1];
        var startingdate = rows[i][3];
        var endingdate = rows[i][4];
        MailApp.sendEmail(currentEmail,"Thank You for Applying Leave via Leave form: your request leave starting" + startingdate + "until" + endingdate,"Hello");
      }
    }
    

    希望对你有帮助!

    参考

    【讨论】:

    • 这不是主要问题
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多