Выберите Все CSV, затем Вставьте все в Google Sheet - Time Out Issue - PullRequest
0 голосов
/ 04 мая 2018

Во-первых, этот код делает именно то, что мне нужно для решения одной проблемы: если для перемещения слишком много данных, Google отключается и завершает процесс. Если честно / прозрачность, я полный нуб-код сценария, так что я могу упустить что-то действительно простое. Из того, что я могу сказать, этот код стекирует данные строка за строкой, и, если строк слишком много, это и есть моя разбивка. Есть ли причина, почему нужно просто выбрать все данные и вставить все данные? Спасибо за вашу помощь!

function importDataCDOP() {
  var fSource = DriveApp.getFolderById('FILE PATH'); 
  var fi = fSource.getFilesByName('xxxx.csv'); 
  var ss = SpreadsheetApp.openById('FILE PATH');     
  if ( fi.hasNext() ) { 

    var ss1 = SpreadsheetApp.getActiveSpreadsheet();
    var first = ss.getSheetByName('NEWDATA');

    var file = fi.next();
    var csv = file.getBlob().getDataAsString();
    var csvData = CSVToArray(csv); 
    var newsheet = ss.getSheetByName('NEWDATA'); 

    var destSheet = ss.getSheetByName('NEWDATA');
    var lastRow = destSheet.getLastRow();
    destSheet.insertRowAfter(lastRow);
    for ( var i=0, lenCsv=csvData.length; i<lenCsv; i++ ) {
      destSheet.getRange(lastRow + i + 1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
    }


     file.setName("OP report-"+(new Date().toString())+".csv");
  }
};

function CSVToArray( strData, strDelimiter ) {
  strDelimiter = (strDelimiter || ",");

  var objPattern = new RegExp(
    (
      "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
      "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
      "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
  );

  var arrData = [[]];
  var arrMatches = null;
  while (arrMatches = objPattern.exec( strData )){
    var strMatchedDelimiter = arrMatches[ 1 ];
    if (
      strMatchedDelimiter.length &&
      (strMatchedDelimiter != strDelimiter)
    ){
      arrData.push( [] );

    }

    if (arrMatches[ 2 ]){
      var strMatchedValue = arrMatches[ 2 ].replace(
        new RegExp( "\"\"", "g" ),
        "\""
      );

    } else {
      var strMatchedValue = arrMatches[ 3 ];

    }
    arrData[ arrData.length - 1 ].push( strMatchedValue );
  }
  return( arrData );
};

1 Ответ

0 голосов
/ 04 мая 2018

Из вашего вопроса и комментария я могу понять, что вы хотите импортировать данные CSV из файла "xxxx.csv" на лист "NEWDATA" в электронной таблице "ПУТЬ ФАЙЛА", и когда большой CSV данные импортированы, истекшее время превышает ограничение по времени для скрипта Google Apps. Я поняла, что это твоя проблема. Для этой ситуации, как насчет этой модификации? Хотя я не уверен, что эта модификация может решить вашу проблему напрямую, попробуйте запустить ее.

Очки модификации:

  • Извлечение файлового объекта с использованием getFilesByName('xxxx.csv').next(), потому что файл csv только один.
  • var first = ss.getSheetByName('NEWDATA'); и var newsheet = ss.getSheetByName('NEWDATA'); не используются в вашем скрипте.
    • Убрал их.
  • В вашем скрипте двумерный массив данных CSV импортируется каждым элементом.
    • Я думал, что это может быть основной причиной вашей проблемы.
    • В измененном скрипте импортируйте двумерный массив сразу.

Модифицированный скрипт:

Я изменил только importDataCDOP().

function importDataCDOP() {
  var fSource = DriveApp.getFolderById('FILE PATH');
  var file = fSource.getFilesByName('xxxx.csv').next();
  var ss = SpreadsheetApp.openById('FILE PATH');
  var csv = file.getBlob().getDataAsString();
  var csvData = CSVToArray(csv).filter(String);
  var destSheet = ss.getSheetByName('NEWDATA');
  destSheet.getRange(destSheet.getLastRow() + 1, 1, csvData.length, csvData[0].length).setValues(csvData);
  file.setName("OP report-"+(new Date().toString())+".csv");
};

Примечание:

  • Я не изменял CSVToArray().
  • filter(String) удалить элементы только с разрывом строки.
  • Если этот измененный сценарий превысил ограничение времени выполнения, я хотел бы предложить использовать Sheets API.

Если я неправильно понимаю ваш вопрос, и истекшее время изменения сценария превысило ограничение, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...