Google表格脚本在getLastRow上崩溃

时间:2019-01-18 06:45:02

标签: google-apps-script google-sheets

我一直在研究一个脚本,该脚本将传入的数据分成多个部分,将每个部分设置到工作表上,然后对其进行相应的格式化。在空白表上以及错误首次发生之前的先前数据上,它连续好几次都没有问题。

当代码在循环的第三次(五分之一)迭代期间调用sheet.getLastRow()时发生错误,如此处所示。我没有注意到调试数据中有什么地方不对,所以我认为错误一定是在对getLastRow的调用中。我重构了没有getLastRow的代码,但是在尝试应用行带区

时,另一行出现了相同的错误

这两个调用在循环中的前2次均能正常工作。为什么不是第三个?

// For each section apply it to sheet

sections.forEach( function(x) {

    var sect = collectionOfSections[x];

    if (!sect) return;

    // If sheet empty apply to first row, otherwise apply after last row + spacing
    var row = (sheet.getLastRow())
        ? sheet.getLastRow() + spacing
        : 1;

    // Grab the first cell of range
    var cell = sheet.getRange(row, 1);

    if (sect.length === 1) {
    // Format according to length and content

        cell.offset(0, 0, 1, sect[0].length)
            .setValues(sect)
            .setBackground(colors[0])
            .setHorizontalAlignment('center')
            .setFontFamily(fontFamily)
            .setFontWeight('bold')
            .setFontSize(
                (x===sections[0])
                    ? e_fontSizes[0]
                    : e_fontSizes[1]
            );

        cell.offset(0, 0, 1, sect[0].filter( function(y) {return y === ''} ).length + 1)
            .merge()
            .setFontStyle('italic');

        cell.offset(0, sect[0].length - 1, 1, maxWidth - sect[0].length + 1)
            .merge()
            .setBackground(
                (x === sections[0])
                    ? colors[0]
                    : colors[2]
            );

    } else {

        cell.offset(0, 0, 1, maxWidth)
            .merge()
            .setValue(sect[0][0])
            .setBackground(colors[0])
            .setHorizontalAlignment('center')
            .setFontSize(e_fontSizes[1] + 1)
            .setFontWeight('bold')
            .setFontFamily(fontFamily)
            .setFontStyle('italic');

        cell.offset(1, 0, 1, sect[1].length)
            .setValues([sect[1]])
            .setHorizontalAlignment('center')
            .setFontFamily(fontFamily)
            .setFontSize(e_fontSizes[1])
            .setFontWeight('bold');

        // for loop start 2, set Values then iterate through each and format accordingly
        for (var i = 2; i < sect.length; i++) {

            cell.offset(i, 0, 1, sect[i].length)
                .setValues([sect[i]])
                .setFontFamily(fontFamily)
                .setFontSize(e_fontSizes[1]);

            sect[i].forEach( function(y, j) {

                if(!isNaN(y) && y.toString().length > 9) cell.offset(i , j, 1, 1).setHorizontalAlignment('center').setNumberFormat(phoneFormat);
                if(y.toString().indexOf('@') > -1) cell.offset(i, j, 1, 1).setHorizontalAlignment('center');
            });

        }   // Apply row banding around content
        cell.offset(1, 0, sect.length - 1, maxWidth)
            .applyRowBanding()
            .setHeaderRowColor(colors[1])
            .setFirstRowColor(colors[2])
            .setSecondRowColor(colors[3]);
    }

    if (x != sections[0]) {
    // If not first section, give section a named range
        var range;
        if (sect.length > 2) range = cell.offset(2, 0, sect.length - 2, maxWidth);
        else range = cell.offset(0, sect[0].length - 1, 1, maxWidth - sect[0].length + 1);

        sheet.getParent()
            .setNamedRange(sheet.getName() + '_' + x, range);
    }
});

1 个答案:

答案 0 :(得分:1)

这可能与sheet.getParent().setNamedRange(sheet.getName()+'_'+x, range);有关 但不是#135行。

目前尚不清楚原因,并且未在任何地方进行记录,但setNamedRange()有时不允许您将工作表名称包含在范围名称字符串中。尝试以某种方式修改范围的命名。