Перебрать пару столбцов - PullRequest
       6

Перебрать пару столбцов

0 голосов
/ 24 сентября 2019

в самом начале с листа Google.

Мне удалось создать нужную мне функцию:

function happy() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('C5').activate();
  spreadsheet.getCurrentCell().setFormula('=G4');
  spreadsheet.getRange('H4').activate();
  var current_e15=spreadsheet.getRange('E15').getValue();
  spreadsheet.getCurrentCell().setValue(current_e15);



  spreadsheet.getRange('C5').activate();
  spreadsheet.getCurrentCell().setFormula('=G5');
  spreadsheet.getRange('H5').activate();
  var current_e15=spreadsheet.getRange('E15').getValue();
  spreadsheet.getCurrentCell().setValue(current_e15);

  ...
  ...
  ...

Функция читает столбец G [i], присваивает его C5, читает результат, полученный из нового значения, вE15 и поместите это значение в ячейку H [i].

Очевидно, что это можно сделать по циклу над i вместо копирования за этот же блок и замены G4 на G5 и H4 на H5 и т. Д.

Я просто не знаю, как сказатьэто в этом языке.

Я пробовал это, которое, очевидно, не работает.

function happyloop() {
  var spreadsheet = SpreadsheetApp.getActive();

  var CellsG = spreadsheet.getRange('G4:G15');
  var CellsH = spreadsheet.getRange('H4:H15');
  for (var i = 0; i < CellsG.length; i++) {
    spreadsheet.getRange('C5').activate();
    spreadsheet.getCurrentCell().setFormula('=CellsG[i]');
    spreadsheet.getRange(CellsH[i]).activate();
    var current_e15=spreadsheet.getRange('E15').getValue();
    spreadsheet.getCurrentCell().setValue(current_e15);
 }

};

Я был бы рад получить помощь, как правильно настроить эту функцию на языке Google.

Спасибо, если вы можете помочь:)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я взял ваш рабочий ответ и внес в него небольшие изменения, чтобы добиться более элегантного , как вы и просили.Оригинальные сценарии запускаются за 4,5 секунды, а модифицированная версия - за 2,5 секунды.Это оптимизированная версия:

function happyLoop() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheets()[0];
  var C5 = sheet.getRange('C5');
  var E15 = sheet.getRange('E15').getValue();
  for (var i = 4; i < 16; i++) {
    C5.setValue(sheet.getRange(i, 7).getValue());
    sheet.getRange(i, 8).setValue(E15);
  }
}

Я изменил имена переменных, чтобы мне было понятнее, но это не улучшение скорости.Чтобы добиться большей скорости, я вынул из цикла for все, что не зависит от итератора i.Обратите также внимание на то, как я вложил каждый вызов метода.

Чтобы еще больше улучшить этот код, мне придется понять ваш исходный сценарий.Большим возможным улучшением является использование .setValues только один раз в полном коде, потому что это самый медленный метод, и здесь он вызывается в каждой итерации.Наконец, я хочу поделиться с вами лучшими практиками Apps Script .Пожалуйста, не стесняйтесь спрашивать меня о более глубоких разъяснениях.

0 голосов
/ 24 сентября 2019

Я наконец дошел до того, что работает.

Если есть более элегантный способ сделать это, пожалуйста, поправьте меня.Спасибо

function happyloop() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheets()[0];
  for (var i = 4; i < 16; i++) {
    sheet.getRange('C5').activate();
    var current_Gi=sheet.getRange(i,7).getValue();
    sheet.getCurrentCell().setValue(current_Gi);
    sheet.getRange(i,8).activate();
    var current_e15=sheet.getRange('E15').getValue();
    sheet.getCurrentCell().setValue(current_e15);
  }
 }
...