Оптимизация сценария извлечения данных из нескольких листов Google - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу, чтобы скрипт выполнял поиск по нескольким файлам Google Sheets и извлекал информацию c из каждого файла, чтобы создать главную страницу состояния, которую мой начальник может легко увидеть. Следующий код работает, он просто очень медленный (и я, вероятно, не делаю это самым простым способом). Какой лучший способ ускорить это? Я уверен, что есть какой-то способ настроить массив, но я теряюсь, пытаясь найти его.

  var ss = SpreadsheetApp.getActive()
  var folder = DriveApp.getFolderById()

// Sets up the rules for what to search
  var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS)
  while (files.hasNext()) {
    var file = files.next()
    var filelog = file.getId()
    var tickets = SpreadsheetApp.openById(file.getId())

//Gets Values from Each File
    var ticketno = tickets.getRange('Form!C1').getValue()
    var jobname = tickets.getRange('Form!C3').getValue()
    var status = tickets.getRange('Form!H1').getValue()
    var assigned = tickets.getRange('Form!C22').getValue()
    var description = tickets.getRange('Form!A18').getValue()


//Sets Values to Master Spreadsheet
    var ssh = ss.getSheetByName("Order Status")
    ssh.insertRowAfter(1)
    ss.getRange('Order Status!A2').setValue(ticketno)
    ss.getRange('Order Status!B2').setValue(jobname)
    ss.getRange('Order Status!C2').setValue(status)
    ss.getRange('Order Status!D2').setValue(assigned)
    ss.getRange('Order Status!E2').setValue(description)

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это быстрее, но на самом деле самый большой фрагмент времени, вероятно, просто открывает файлы.

function faster() {
  var ss=SpreadsheetApp.getActive();
  var folder=DriveApp.getFolderById();
  var files=folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  while (files.hasNext()) {
    var file=files.next();
    var tss=SpreadsheetApp.openById(file.getId());
    var vA=tss.getSheetByName('Form').getRange(1,1,22,8).getValues();
    var ssh=ss.getSheetByName("Order Status")
    ssh.insertRowAfter(1);//you could avoid this by creating a sheet that you could append to and that would be a little faster
    SpreadsheetApp.flush();//not sure if this is needed but this has to complete before the next operation takes place
    ssh.getRange(2,1,1,5).setValues([[vA[0][2],vA[2][2],vA[0][7],vA[21][2],vA[17][0]]]);
  }
}
0 голосов
/ 19 февраля 2020

Я зациклил сценарии 50 раз. Время выполнения вашего скрипта составило 259 342 секунды, время выполнения «моего» 83 479 секунд

function notAsSlow(){

var ss = SpreadsheetApp.getActive()
  var folder = DriveApp.getFolderById("1fgROgjHBssvhaSIy5KWv0BhNFlH3EfTI")

  var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS)

  var array=[];

    while (files.hasNext()) {

      var file = files.next()
      var filelog = file.getId()
      var tickets = SpreadsheetApp.openById(file.getId())

      var dataTickets = tickets.getSheetByName("Form").getDataRange().getValues();

      var ticketno = dataTickets[0][2];
      var jobname = dataTickets[2][2];
      var status = dataTickets[7][0];
      var assigned = dataTickets[21][2];
      var description = dataTickets[17][0];

      array.push([ticketno,jobname,status,assigned,description]);

    }

    var ssh = ss.getSheetByName("Order Status");

    if(array[0]){
      ssh.getRange(ssh.getLastRow()+1,1,array.length,5).setValues(array);

    }

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