0

Google Apps Script を使用して CSV データをインポートしています。すべての CSV データがインポートされますが、次のエラー メッセージが引き続き表示されます。

範囲幅が正しくありません。1 でしたが、5 にする必要があります

私の CSV ファイルは を使用';'して区切られており、そこにもコンマが含まれています。私の CSV ファイルの例:

FJ32-19A354-AA;'BES_301 - Exterior Trim;'000101;BOM No CAD;04/01/16

合計で 5 つの列があり、getRange()呼び出しで列の数を指定すると、別のエラーが発生します。

メソッド getRange(number,number,number,number,number) が見つかりません

私が現在使用しているコード例(「Ask Ben」から適応):

var ss = SpreadsheetApp.openById('1V8YG8lyNZiTllEPHENcnabYRLDPCK6mHGUyAyNhW0Is'); // data_sheet_id = id of spreadsheet that holds the data to be updated with new report data
var s = SpreadsheetApp.getActiveSheet();
var csv = file.getBlob().getDataAsString();
var csvData = CSVToArray(csv); // see below for CSVToArray function
var lastrow = s.getLastRow(); 
  s.getRange(lastrow+ 1, 1,5, csvData.length, csvData[0].length).setValues(csvData);

function CSVToArray( strData, strDelimiter ){

    strDelimiter = (strDelimiter || ";");


    var objPattern = new RegExp(
        (
            // Delimiters.
            "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
            "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
            "([^\"\\" + strDelimiter + "\\r\\n]*))"
        ),
        "gi"
        );


    var arrData = [[]];

    var arrMatches = null;

    while (arrMatches = objPattern.exec( strData )){

        // Get the delimiter that was found.
        var strMatchedDelimiter = arrMatches[ 1 ];

        // Check to see if the given delimiter has a length
        // (is not the start of string) and if it matches
        // field delimiter. If id does not, then we know
        // that this delimiter is a row delimiter.
        if (
            strMatchedDelimiter.length &&
            strMatchedDelimiter !== strDelimiter
            ){

            // Since we have reached a new row of data,
            // add an empty row to our data array.
            arrData.push( [] );

        }

        var strMatchedValue;

        // Now that we have our delimiter out of the way,
        // let's check to see which kind of value we
        // captured (quoted or unquoted).
        if (arrMatches[ 2 ]){

            // We found a quoted value. When we capture
            // this value, unescape any double quotes.
            strMatchedValue = arrMatches[ 2 ].replace(
                new RegExp( "\"\"", "g" ),
                "\""
                );

        } else {

            // We found a non-quoted value.
            strMatchedValue = arrMatches[ 3 ];

        }

        // Now that we have our value string, let's add
        // it to the data array.
        arrData[ arrData.length - 1 ].push( strMatchedValue );
    }

    // Return the parsed data.
    return( arrData );
}
4

2 に答える 2

2

エラーは、次のコード行から発生しています。

s.getRange(lastrow+ 1, 1,5, csvData.length, csvData[0].length).setValues(csvData);

括弧内に 5 つの値があります。 getRange()最大で 4 つのパラメータを取ります。

.getRange(start Row, start Column, Number of Rows, Number of Columns)

5番号または を削除しますcsvData.length

現在、csvData.lengthではなく、「列数」設定に使用されている可能性がありますcsvData[0].length

サンプル データで関数を実行するCSVToArray()と、次の 2 次元配列が得られます。

[["FJ32-19A354-AA", "'BES_301 - Exterior Trim", "'000101", "BOM No CAD", "04/01/16"]]

長さを記録すると:

Logger.log('arrData[0].length: ' + arrData[0].length);

正しい長さの 5 を返します。そのCSVToArray()ため、提供されたデータ例では、関数が正しく機能しているように見えます。

今、あるべき5場所に番号があります。number of rowsただし、外側の配列には内側の配列が 1 つしかありません。それはエラーメッセージの意味があります。コードは 5 行あるべきだと「考え」ますが、1 行しかありません。

于 2016-01-05T18:45:17.830 に答える