@Dofre

Почему программа не срабатывает так, как ожидается при изменении всего одной типовой команды?

Не могу понять в чем подвох, если удалить последнюю строчку, то все прекрасно работает.
Если же ее оставить, то все работает, кроме самой этой строки и cell4.copyTo(destination4) вот этого момента (18 строка).

Соответственно не знаю, как исправить. Прошу помощи.

function onEdit(e) {
  var activeSheet = e.source.getActiveSheet();
  if (['Лист'].indexOf(activeSheet.getName()) == -1) return;
  var r = SpreadsheetApp.getActiveRange();
  var cols = r.getColumn();
  if (cols == 6) {
    // если изменяем 6 колонку, то тригер работает и:
    var cell1 = activeSheet.getRange(2, 2); //во второй колонке берет данные из второй строки (там лежит формула)
    var destination1 = activeSheet.getRange(activeSheet.getLastRow(), 2); // находит последнюю строку с данными и выбирает вторую колонку
    cell1.copyTo(destination1); // копирует из второй строчки в последнюю
    var cell2 = activeSheet.getRange(2, 3); // тоже самое но только для 3 колонки
    var destination2 = activeSheet.getRange(activeSheet.getLastRow(), 3); //тоже самое но только для 3 колонки
    cell2.copyTo(destination2); //тоже самое но только для 3 колонки
    var cell3 = activeSheet.getRange(2, 5); //тоже самое но только для 5 колонки
    var destination3 = activeSheet.getRange(activeSheet.getLastRow(), 5); //тоже самое но только для 5 колонки
    cell3.copyTo(destination3); //тоже самое но только для 5 колонки
    var cell4 = activeSheet.getRange(2, 8); //тоже самое но только для 8 колонки
    var destination4 = activeSheet.getRange(activeSheet.getLastRow(), 8); //тоже самое но только для 8 колонки
    cell4.copyTo(destination4); //тоже самое но только для 8 колонки

    destination1.copyTo(
      destination1,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); //во второй колонке меняет формулу на значение
    destination2.copyTo(
      destination2,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); //в третьей колонке меняет формулу на значение
    destination3.copyTo(
      destination3,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); //в пятой колонке меняет формулу на значение
    destination4.copyTo(
      destination4,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); //в восьмой колонке меняет формулу на значение
  }
}
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Перед тем, как копировать формулы в значения вам нужно завершить все расчеты в Таблице.

Вызовите flush()

SpreadsheetApp.flush();

Например,

/**
 *
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
function onEdit(e) {
  var activeSheet = e.source.getActiveSheet();
  SpreadsheetApp.getActive().toast(['Лист'].indexOf(activeSheet.getName()));
  if (['Лист'].indexOf(activeSheet.getName()) == -1) return;
  var r = SpreadsheetApp.getActiveRange();
  var cols = r.getColumn();
  if (cols == 6) {
    // если изменяем 6 колонку, то тригер работает и:
    var cell1 = activeSheet.getRange(2, 2); // во второй колонке берет данные из второй строки (там лежит формула)
    var destination1 = activeSheet.getRange(activeSheet.getLastRow(), 2); // находит последнюю строку с данными и выбирает вторую колонку

    cell1.copyTo(destination1); // копирует из второй строчки в последнюю
    var cell2 = activeSheet.getRange(2, 3); // тоже самое но только для 3 колонки
    var destination2 = activeSheet.getRange(activeSheet.getLastRow(), 3); // тоже самое но только для 3 колонки
    cell2.copyTo(destination2); // тоже самое но только для 3 колонки
    var cell3 = activeSheet.getRange(2, 5); // тоже самое но только для 5 колонки
    var destination3 = activeSheet.getRange(activeSheet.getLastRow(), 5); // тоже самое но только для 5 колонки
    cell3.copyTo(destination3); // тоже самое но только для 5 колонки
    var cell4 = activeSheet.getRange(2, 8); // тоже самое но только для 8 колонки
    var destination4 = activeSheet.getRange(activeSheet.getLastRow(), 8); // тоже самое но только для 8 колонки
    cell4.copyTo(destination4); // тоже самое но только для 8 колонки

    SpreadsheetApp.flush();

    destination1.copyTo(
      destination1,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); // во второй колонке меняет формулу на значение
    destination2.copyTo(
      destination2,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); // в третьей колонке меняет формулу на значение
    destination3.copyTo(
      destination3,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); // в пятой колонке меняет формулу на значение
    destination4.copyTo(
      destination4,
      SpreadsheetApp.CopyPasteType.PASTE_VALUES,
      false
    ); // в восьмой колонке меняет формулу на значение
    SpreadsheetApp.getActive().toast('Готово');
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы