GetRange() выдает ошибку ширины после 3000 строк

Код getrange выдает ошибку

Неверная ширина диапазона, была 1, но должна быть 5

Файл CSV содержит 8127 строк, и когда я разбил файл на 8 разных файлов, каждый из которых содержал 1000 строк, и обработал их по отдельности, все они завершились без ошибок. Но как только я обрабатываю файл больше 3000+ строк, он получает сообщение об ошибке выше.

ниже приведен код диапазона

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

Я также попробовал это, но это получает ошибку, заявляющую, превысил максимальное время выполнения:

for (var i = 0; i < csvData.length; i++) {
 ss.getRange(i + 1,1,1,csvData[i].length).setValues(new Array(csvData[i]));
}

Файл CSV является 2D.

Ниже приведен полный код:

Function getCSV() {
var fSource = DriveApp.getFolderById('0B2lVvlNIDosoajRRMUwySVBPNVE');      //reports_folder_id = id of folder where csv reports are saved 
var date= Utilities.formatDate(new Date(), "GMT", "dd-MM-yy");
var fi = fSource.getFilesByName('L661_BOM-CAD_07-01-16.csv'); 
// latest  report file
var ss =  SpreadsheetApp.openById('1V8YG8lyNZiTllEPHENcnabYRLDPCK6mHGUyAyNhW0Is').getSheet s()[0]; // data_sheet_id = id of spreadsheet that holds the data to be updated  with new report data Sheet will be opened server side. 

ss.getName() == "Sheet1"
if ( fi.hasNext()) { // proceed if "report.csv" file exists in the reports  folder
var file = fi.next();
//file.setName('L661_BOM-CAD_'+ date +'(EXPORTED)'+'.csv');
  var csv = file.getBlob().getDataAsString();
  var csvData = CSVToArray(csv);
  Logger.log('csvData[0].length: ' + csvData[0].length + ' csvData.length:'  + csvData.length);
  var lastrow = ss.getLastRow();

  for (var i = 0; i < csvData.length; i++) {
 ss.getRange(i + 1,1,1,csvData[i].length).setValues(new Array(csvData[i]));
 }
}

if( ss.getName() == "Sheet1" ) { //checks that we're on the correct sheet
var r= ss.getRange('A1');
if( r.getColumn() == 1 ) { //checks the column
 var nextCell = r.offset(0, 5);
 if( nextCell.getValue() === '' ) //is empty?
   var date = new Date();
   var date= Utilities.formatDate(new Date(), "GMT", "dd-MM-yy");
   nextCell.setValue(date); //enters the date in F1 in dd/mm/yyyy format
     };
   };
 };

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 );
        Logger.log('arrData[0].length: ' + arrData[0].length);
    }

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

1 ответ

Проверьте значение csvData[0].length снова. Это говорит, что длина должна быть 5, но это дает 1.

Поскольку в нем более 3000 записей, оно превысит максимальное время выполнения. установка значений займет много времени, когда он находится в цикле. Что вы хотите сделать, это сначала получить значения в массив и установить их один раз позже.

var myvalueArray = [];

for (var i = 0; i < csvData.length; i++) {
 // do not set value here
 //ss.getRange(i + 1,1,1,csvData[i].length).setValues(new Array(csvData[i]));
 //push your values to an array
  myvalueArray.push(csvData[i]);
}

как только вы поместите свои значения в определенный массив, установите их один раз в вашем диапазоне.

ss.getRange(1,1,1,csvData[i].length).setValues(myvalueArray);
Другие вопросы по тегам