Синхронизация скриптов Google Apps (требуется более простой подход) - PullRequest
0 голосов
/ 23 мая 2019

Я использую этот скрипт для построения статистики по каждому из моих коллег, и он включает в себя 15 сводных таблиц, которым часто нужно обновлять свои фильтры для разных периодов времени. У меня много коллег на этом листе, поэтому сценарий для 15 таблиц на человека в итоге занимает слишком много времени и времени.

Я включаю одну таблицу, но код будет иметь 15 итераций этого на человека ( раз 20+ человек ).

Как я могу предотвратить тайм-аут? Либо путем обхода, либо очистки моего кода для большей эффективности.

function MassUpdateofFilters() {
    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange('Andrew!A1').activate();
    var sourceData = spreadsheet.getRange('Batches!1:997');
    var pivotTable = spreadsheet.getRange('A1').createPivotTable(sourceData);
    pivotTable.setValuesDisplayOrientation(SpreadsheetApp.Dimension.ROWS);
    var pivotValue = pivotTable.addPivotValue(3, SpreadsheetApp.PivotTableSummarizeFunction.SUM);
    var pivotGroup = pivotTable.addRowGroup(5);
    pivotGroup.showTotals(false)
        .sortDescending()
        .sortBy(pivotTable.getPivotValues()[0], []);
    pivotGroup = pivotTable.addRowGroup(4);
    pivotGroup.showTotals(false);
    var criteria = SpreadsheetApp.newFilterCriteria()
        .setVisibleValues(['Andrew'])
        .build();
    pivotTable.addFilter(5, criteria);
    criteria = SpreadsheetApp.newFilterCriteria()
        .setVisibleValues([ '1', '2', '3', '5', '6', '7'])
        .build();
    pivotTable.addFilter(16, criteria);
    criteria = SpreadsheetApp.newFilterCriteria()
        .setVisibleValues(['April'])
        .build();
    pivotTable.addFilter(15, criteria);
    criteria = SpreadsheetApp.newFilterCriteria()
        .setVisibleValues(['2019'])
        .build();
    pivotTable.addFilter(17, criteria);
};

Ответы [ 2 ]

1 голос
/ 23 мая 2019

У Google есть руководство по передовому опыту здесь: https://developers.google.com/apps-script/guides/support/best-practices

Я вижу, что вы вызываете сервис SpreadsheetApp семь раз. Это медленно. Было бы лучше вызвать его один раз, чтобы получить данные, а затем вызвать его снова, чтобы записать данные (если это вообще возможно). Кроме того, не могли бы вы использовать службу кэширования для однократного извлечения данных из электронной таблицы и многократного манипулирования их копиями для каждого отдельного пользователя?

https://developers.google.com/apps-script/reference/cache/cache

0 голосов
/ 23 мая 2019

Я бы сначала порекомендовал ознакомиться с рекомендациями .

При этом мне нужно было запустить скрипт на нескольких тысячах листов и разработать этот небольшой кусочек кода, чтобы помочьс проблемами тайм-аута.Он запускает цикл, который истекает сам по себе, и вы можете установить триггер для его запуска каждые 5 или 10 минут.Через несколько часов это сделает свое дело.Имейте в виду, что Google в конечном итоге определит время ожидания, если вы сделаете это слишком много, и вам, возможно, придется подождать день или около того, чтобы запустить его снова.

function changeAll() {

  var startd = new Date();
  var diff = 0;

  var start = Number(PropertiesService.getScriptProperties().getProperty("START"));
  Logger.log(start);



  for(var i = start; i < YOUR_MAX && diff < 280; i++){

    //MAKE CHANGES HERE **************************************************************************


    //END CHANGE AREA ****************************************************************************
    //Change time and counter for next run
    PropertiesService.getScriptProperties().setProperty("START", i);

    var now = new Date();
    var difdate = (now.getTime() - startd.getTime()) * 0.001;
    diff = difdate;
    Logger.log("DIFF: " + diff);

  }

}



...