Google Apps Script已定义数组访问报Cannot read property '0' of undefined错误
报错原因
Cannot read property '0' of undefined 错误触发是因为你循环的边界超出了data数组的有效索引范围,同时还存在样式取值范围错误的问题,具体问题点如下:
- 外层行循环边界错误:你定义
data时取的行数是Alast-3,数组索引从0开始,所以row的有效范围是0 ~ (Alast-4),你写的row <= Alast会导致row远大于data的长度,访问data[row]返回undefined,再访问[col]就触发报错 - 内层列循环边界错误:你要求固定4列,数组列索引是
0~3,你写的col <=4会让col取值到4,超出列的有效范围 - 样式取值范围错误:你定义的
rangito仅对应A4单个单元格,后续获取的fontFamilies、backgrounds等样式数组都只有1行1列,循环中使用fontFamilies[row][col]必然触发越界错误,应该取和data范围一致的区域来读取样式
修复后代码
function getHtmlTable(table){ var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Emails"); var Avals = ws.getRange("A1:A").getValues(); var Alast = Avals.filter(String).length; // 提前计算data的行数,统一复用避免边界不一致 var dataRowCount = Alast - 3; var data = ws.getRange(4, 1, dataRowCount, 4).getValues(); // 取和data同范围的区域读取样式,避免样式数组越界 var rangito = ws.getRange(4, 1, dataRowCount, 4); var fontColors = rangito.getFontColors(); var backgrounds = rangito.getBackgrounds(); var fontFamilies = rangito.getFontFamilies(); var fontSizes = rangito.getFontSizes(); var fontLines = rangito.getFontLines(); var fontWeights = rangito.getFontWeights(); var horizontalAlignments = rangito.getHorizontalAlignments(); var verticalAlignments = rangito.getVerticalAlignments(); // 生成表格框架 var tableFormat = 'style="border:1px solid black;border-collapse:collapse;text-align:center" border = 1 cellpadding = 5'; var html = ['<table '+tableFormat+'>']; // 修正行循环边界:仅遍历到data数组的最大索引 for (var row= 0;row < dataRowCount;row++) { html.push('<tr style="height: 19px;">'); // 修正列循环边界:仅遍历4列的有效索引0~3 for (var col= 0 ;col < 4;col++) { var cellText = data[row][col]; var style = 'style="' + 'font-family: ' + fontFamilies[row][col]+'; ' + 'font-size: ' + fontSizes[row][col]+'; ' + 'font-weight: ' + fontWeights[row][col]+'; ' + 'background-color: ' + backgrounds[row][col]+'; ' + 'text-align: ' + horizontalAlignments[row][col]+'; ' + 'vertical-align: ' + verticalAlignments[row][col]+'; ' +'"'; html.push('<td ' + style + '>' +cellText +'</td>'); } html.push('</tr>'); } html.push('</table>'); return html.join(''); }
内容的提问来源于stack exchange,提问作者Kristian Andreas Brinckmann
相关产品推荐
相关产品推荐

