D
D
Dofre2020-04-28 12:34:49
Google Apps Script
Dofre, 2020-04-28 12:34:49

Why doesn't the program work as expected when changing just one typical command?

I can not understand what is the catch, if you remove the last line, then everything works fine.
If you leave it, then everything works, except for this line itself and cell4.copyTo(destination4)this moment (line 18).

Accordingly, I do not know how to fix it. Please help.

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
    ); //в восьмой колонке меняет формулу на значение
  }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexander Ivanov, 2020-04-28
@Dofre

Before you can copy formulas to values, you need to complete all calculations in the spreadsheet.
Call flush()
SpreadsheetApp.flush();
For example,

/**
 *
 * @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('Готово');
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question