Как пройти через скрипт Google - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь написать макрос скрипта Google Sheets.Как мне пройти через это, чтобы понять, почему время превышается?Моя проблема в цикле, когда я устанавливаю max итерации (сценарии) равным 46, код, кажется, работает нормально, занимая около 1-2 секунд.Когда макс установлен на 47, он умирает с превышением максимального времени выполнения (4-5 минут).Что происходит?

function testing() {

  var aa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Run 
  Program");

  var scenarios = aa.getRange("H19").getValue();



  for (i = 1; i <= scenarios; i++){

  var ss = 
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet6");

  var range = ss.getRange("b6:u6");
  var min = 1  ;
  var max = 20 ; 
  var numbers = []
    for (var i = min; i <= max; i++) {             
      numbers.push(i);
  }  


  shuffleArray(numbers)
  var counter = 0;
  for (var x = 1; x <= range.getWidth(); x++) {
    for (var y = 1; y <= range.getHeight(); y++) {
      range.getCell(y, x).setValue(numbers[counter]);
      counter++;
    }
  }
  var range = ss.getRange("v6:ao6");
  var min = 21  ;
  var max = 40  ;
  var numbers = []
    for (var i = min; i <= max; i++) {
     numbers.push(i);
  }
  shuffleArray(numbers)
  var counter = 0;
  for (var x = 1; x <= range.getWidth(); x++) {
    for (var y = 1; y <= range.getHeight(); y++) {
      range.getCell(y, x).setValue(numbers[counter]);
      counter++;
    }
  }
  var range = ss.getRange("ap6:at6");
  var min = 41  ;
  var max = 45  ;
  var numbers = []
    for (var i = min; i <= max; i++) {
     numbers.push(i);
  }
  shuffleArray(numbers)
  var counter = 0;
  for (var x = 1; x <= range.getWidth(); x++) {
    for (var y = 1; y <= range.getHeight(); y++) {
      range.getCell(y, x).setValue(numbers[counter]);
      counter++;
    }
  }
  }
//  function Chart4() {
  var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('A1').activate();
      spreadsheet.getSheetByName('Chart4').showSheet()
     .activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Chart4'), 
true);
};

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Ваш код нуждается в большой помощи.Вот совет для начала.

Как уже упоминали другие, вы должны вызывать .getValues ​​() для всего диапазона, который дает вам двумерный массив значений ячеек [[A1value, B1value, ...], [A2val, B2val ...], ...].Сначала вы должны взять ширину и длину и назначить переменную.Ссылка на эту переменную вместо вызова API в условиях цикла.Фактически, поскольку вы знаете диапазоны заранее, вы должны определить все диапазоны, которые вам понадобятся вне основного цикла for, а также электронную таблицу (ы):

var aa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Run Program");
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet6");
var range1 = ss.getRange("b6:u6");
var range2 = ss.getRange("v6:ao6");
for (i = 1; i <= scenarios; i++) { ...

Запуск сценариевЭто займет много времени, если вы будете повторять вызовы API.

Не совсем точно, что пытается сделать ваш макрос, но вот шаблон для запуска такого рода цикла и как вы должны думать об этом.

var range = ss.getRange(A1-style-address);
var values = range1.getValues();

var width = range1[0].length;
var height = range1.length;

var new_values = new Array(); 

for (var i = 0; i < height; i++) {
    for (var j = 0; j < width; j++) {

       //do something with values[i][j], like push to new_values

    }
}
//something like:
//var new_range = ss.getRange(different A1-style address) 
//new_range.setValues(new_array)  

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

Я оставлю вам возможность выяснить, как изменить массив new_values ​​внутри цикла, чтобы убедиться, что он имеет правильный размер.

Вот ссылка на обзор массивов в javascript, если это ново для вас, и вот некоторая документация по массиву .

0 голосов
/ 10 июня 2018

Вызов Range.getCell () иногда может быть дорогим, и его следует избегать.Используйте Range.getValues ​​() и итерируйте по двумерному массиву.Также вместо использования активной электронной таблицы откройте электронную таблицу по Id для модульного тестирования.Таким образом, вы сможете отлаживать / запускать из редактора GAS напрямую.Редактор GAS обычно обнаруживает такие проблемы с производительностью в коде и отображает предупреждения, указывающие на номер строки в коде.

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