Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Автоматизация вызова скрипта в гугл таблицах - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Google Docs » Автоматизация вызова скрипта в гугл таблицах (Формулы/Formulas)
Автоматизация вызова скрипта в гугл таблицах
AraB Дата: Суббота, 03.06.2023, 20:23 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Добрый день,уважаемые!
Такая ситуация... Есть две гугл таблицы в одной хранятся данные про задачи: название задачи, время начала, конца, продолжительность. Эти данные импортируются во вторую таблицу (импортируются при помощи importrange) в которой, происходит дальнейшая работа с данными.
При добавлении строк в таблицу, из которой берутся данные, во второй таблице просто изменялся размер вставляемого диапазона, но вписанные до этого данные и закраска не передвигались. Для решения этой проблемы были написаны два скрипта. Скрипт 1 - крепится к таблице из которой берутся данные, для его работы необходимо две ячейки - в одну он записывает значение первой ячейки столбца А, т.е. туда попадает следую значение после добавленной нами строки( тобишь значение, которое перемещается при добавлении строк), во вторую помещается количество добавленных строк. Второй скрипт, активируется при нажатии кнопки (она вынесена в меню сверху) и при нахождении нашего значения, которое мы определили при помощи первого скрипта, то он запоминает его и уже далее добавляет перед ним строки столько раз, сколько мы определили при помощи скрипта №1.

Необходимо, чтобы скрипт, который добавляет строки активировался автоматически при добавлении строк в таблице 1 (из которой берутся данные), как это сделать подскажите, пожайлуста

Прикрепляю ссылки на таблицы:
Таблица 1 из которой берутся данные для главной таблицы: https://docs.google.com/spreads....t#gid=0

Таблица 2 в которую импортируюся данные и в которой необходима автоматизация скрипта: https://docs.google.com/spreads....3745767

Так же прикрепляю отдельно код:
Скрипт 1

[vba]
Код
function onEdit(e) {//функция вызываемая при любом изменении в таблице
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");//берём лист на котором мы работаем
  var startRow = e.range.getRow();// Получаем начальную строку редактируемого диапазона
  var numRows = e.range.getNumRows();// Получить количество строк в редактируемом диапазоне
  var firstCell = sheet.getRange(startRow+numRows, 1);//берём диапазон в виде одной ячейки,и запихиваем туда ячейку, которую мы передвигаем
  var firstCellValue = firstCell.getValue();//вычисляем значение находящиеся в ячейке
  var savedCell = sheet.getRange("A1");//куда сохраним значении первой ячейки столбца "А", строки которую мы переместили
  var savedCell1 = sheet.getRange("A2");//куда сохраним кол-во строк, которые мы добавили
  savedCell.setValue(firstCellValue);//вычисляем строку, которая переместилась в результате добавления
  savedCell1.setValue(numRows);//сохраняем количество строк, которые мы добавили
}
[/vba]

Скрипт 2

[vba]
Код
function myFunction1() {///необходима функция, которая вызывается сразу при любом изменении таблицы
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2");//получаем активный лист
  var range = sheet.getRange("A3:D"); // получаем диапазон с листа
  var numRows = range.getNumRows();//кол-во строк
  var temp;//переменная необходимая для хранения строки, в которой находится нужное нам значение
  var savedCellMain = sheet.getRange("A1");//Где хранится значение с которым мы сравниваем
  var savedCellMain1 = sheet.getRange("A2");//Кол-во добавленных строк
  for (var i = 1; i < numRows; i++){ //пробегаем по нашему диапазону до количества строк
    var firstCell = range.getCell(i, 1);//первая ячейка столбца А
    if(firstCell.getValue() == savedCellMain.getValue()){//если значение, которое мы сейчас проходим, равно значению, которое мы определили в нач таблице
      temp = firstCell.getRow();//запоминаем строку в которой находится нужное нам значение
      break;//выходим из цикла
    }
  }
  var end = savedCellMain1.getValue();//считываем значение(количество строк)
  for (var i = 1;i<=end;i++){//пробегаем от 1 до количетсва строк
    sheet.insertRowBefore(temp-end);//вставляем строку
    var lastColumn = sheet.getLastColumn();//вычисляем последний столбик
    var range = sheet.getRange(temp-end,1,1,lastColumn);//выделяем диапазон
    range.setBackground(null);//делаем заливку выбранного диапазона белой (т.е её отсуствие)
  }
}
[/vba]

Подскажите пожайлуса, как автоматизовать вызов скрипта 2
 
Ответить
СообщениеДобрый день,уважаемые!
Такая ситуация... Есть две гугл таблицы в одной хранятся данные про задачи: название задачи, время начала, конца, продолжительность. Эти данные импортируются во вторую таблицу (импортируются при помощи importrange) в которой, происходит дальнейшая работа с данными.
При добавлении строк в таблицу, из которой берутся данные, во второй таблице просто изменялся размер вставляемого диапазона, но вписанные до этого данные и закраска не передвигались. Для решения этой проблемы были написаны два скрипта. Скрипт 1 - крепится к таблице из которой берутся данные, для его работы необходимо две ячейки - в одну он записывает значение первой ячейки столбца А, т.е. туда попадает следую значение после добавленной нами строки( тобишь значение, которое перемещается при добавлении строк), во вторую помещается количество добавленных строк. Второй скрипт, активируется при нажатии кнопки (она вынесена в меню сверху) и при нахождении нашего значения, которое мы определили при помощи первого скрипта, то он запоминает его и уже далее добавляет перед ним строки столько раз, сколько мы определили при помощи скрипта №1.

Необходимо, чтобы скрипт, который добавляет строки активировался автоматически при добавлении строк в таблице 1 (из которой берутся данные), как это сделать подскажите, пожайлуста

Прикрепляю ссылки на таблицы:
Таблица 1 из которой берутся данные для главной таблицы: https://docs.google.com/spreads....t#gid=0

Таблица 2 в которую импортируюся данные и в которой необходима автоматизация скрипта: https://docs.google.com/spreads....3745767

Так же прикрепляю отдельно код:
Скрипт 1

[vba]
Код
function onEdit(e) {//функция вызываемая при любом изменении в таблице
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");//берём лист на котором мы работаем
  var startRow = e.range.getRow();// Получаем начальную строку редактируемого диапазона
  var numRows = e.range.getNumRows();// Получить количество строк в редактируемом диапазоне
  var firstCell = sheet.getRange(startRow+numRows, 1);//берём диапазон в виде одной ячейки,и запихиваем туда ячейку, которую мы передвигаем
  var firstCellValue = firstCell.getValue();//вычисляем значение находящиеся в ячейке
  var savedCell = sheet.getRange("A1");//куда сохраним значении первой ячейки столбца "А", строки которую мы переместили
  var savedCell1 = sheet.getRange("A2");//куда сохраним кол-во строк, которые мы добавили
  savedCell.setValue(firstCellValue);//вычисляем строку, которая переместилась в результате добавления
  savedCell1.setValue(numRows);//сохраняем количество строк, которые мы добавили
}
[/vba]

Скрипт 2

[vba]
Код
function myFunction1() {///необходима функция, которая вызывается сразу при любом изменении таблицы
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2");//получаем активный лист
  var range = sheet.getRange("A3:D"); // получаем диапазон с листа
  var numRows = range.getNumRows();//кол-во строк
  var temp;//переменная необходимая для хранения строки, в которой находится нужное нам значение
  var savedCellMain = sheet.getRange("A1");//Где хранится значение с которым мы сравниваем
  var savedCellMain1 = sheet.getRange("A2");//Кол-во добавленных строк
  for (var i = 1; i < numRows; i++){ //пробегаем по нашему диапазону до количества строк
    var firstCell = range.getCell(i, 1);//первая ячейка столбца А
    if(firstCell.getValue() == savedCellMain.getValue()){//если значение, которое мы сейчас проходим, равно значению, которое мы определили в нач таблице
      temp = firstCell.getRow();//запоминаем строку в которой находится нужное нам значение
      break;//выходим из цикла
    }
  }
  var end = savedCellMain1.getValue();//считываем значение(количество строк)
  for (var i = 1;i<=end;i++){//пробегаем от 1 до количетсва строк
    sheet.insertRowBefore(temp-end);//вставляем строку
    var lastColumn = sheet.getLastColumn();//вычисляем последний столбик
    var range = sheet.getRange(temp-end,1,1,lastColumn);//выделяем диапазон
    range.setBackground(null);//делаем заливку выбранного диапазона белой (т.е её отсуствие)
  }
}
[/vba]

Подскажите пожайлуса, как автоматизовать вызов скрипта 2

Автор - AraB
Дата добавления - 03.06.2023 в 20:23
Gustav Дата: Воскресенье, 04.06.2023, 00:17 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2739
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 2 для запуска из исходной Таблицы 1. Т.е. надо будет из скрипта 2, находящегося в Таблице 1, обращаться к Таблице 2 как к внешнему объекту. Для этого надо будет переписать строку ссылки на нужный рабочий лист в другом файле в виде:
[vba]
Код
var sheet = SpreadsheetApp.openById("...id Таблицы 2...").getSheetByName("Лист2");
[/vba]
вместо текущей:
[vba]
Код
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2");
[/vba]

Сам же скрипт 2 можно будет вызвать в конце скрипта 1, предварительно выполнив метод flush - для того, чтобы система гарантированно выполнила все отложенные операции, а именно: сохранила новые значения в ячейках A1 и A2 Таблицы 1 и выполнила IMPORTRANGE в Таблице 2:
[vba]
Код
function onEdit(e) {
.....................
savedCell.setValue(firstCellValue);//вычисляем строку, которая переместилась в результате добавления
savedCell1.setValue(numRows);//сохраняем количество строк, которые мы добавили

    // операторы, добавленные в конец скрипта 1
    SpreadsheetApp.flush();  // рефреш
    myFunction1();  // вызов скрипта 2
}
[/vba]

И еще такой совет. Я бы добавил в начало скрипта 2 проверку на непустоту значений параметрических ячеек A1 и A2 в Таблице 2 - как признак удачно завершившегося IMPORTRANGE, а в конце скрипта 2 стирал бы эти значения уже в исходной Таблице 1 - как признак удачного завершения скрипта 2.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 04.06.2023, 00:19
 
Ответить
СообщениеМне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 2 для запуска из исходной Таблицы 1. Т.е. надо будет из скрипта 2, находящегося в Таблице 1, обращаться к Таблице 2 как к внешнему объекту. Для этого надо будет переписать строку ссылки на нужный рабочий лист в другом файле в виде:
[vba]
Код
var sheet = SpreadsheetApp.openById("...id Таблицы 2...").getSheetByName("Лист2");
[/vba]
вместо текущей:
[vba]
Код
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2");
[/vba]

Сам же скрипт 2 можно будет вызвать в конце скрипта 1, предварительно выполнив метод flush - для того, чтобы система гарантированно выполнила все отложенные операции, а именно: сохранила новые значения в ячейках A1 и A2 Таблицы 1 и выполнила IMPORTRANGE в Таблице 2:
[vba]
Код
function onEdit(e) {
.....................
savedCell.setValue(firstCellValue);//вычисляем строку, которая переместилась в результате добавления
savedCell1.setValue(numRows);//сохраняем количество строк, которые мы добавили

    // операторы, добавленные в конец скрипта 1
    SpreadsheetApp.flush();  // рефреш
    myFunction1();  // вызов скрипта 2
}
[/vba]

И еще такой совет. Я бы добавил в начало скрипта 2 проверку на непустоту значений параметрических ячеек A1 и A2 в Таблице 2 - как признак удачно завершившегося IMPORTRANGE, а в конце скрипта 2 стирал бы эти значения уже в исходной Таблице 1 - как признак удачного завершения скрипта 2.

Автор - Gustav
Дата добавления - 04.06.2023 в 00:17
AraB Дата: Вторник, 06.06.2023, 16:49 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 2 для запуска из исходной Таблицы 1. Т.е. надо будет из скрипта 2, находящегося в Таблице 1, обращаться к Таблице 2 как к внешнему объекту. Для этого надо будет переписать строку ссылки на нужный рабочий лист в другом файле в виде:

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

[vba]
Код

function onChanegTrigger(event){
  const destinationSsId = "1G7183qFCfhAt5tJqORrwNjq0_DlMEp2YzOfO9cUUbCI"// Идентификатор целевой таблицы
  const destinationSheetName1 = "Лист1";// Имя целевого листа
  const sourceSheetName = "Лист2";// Имя исходного листа
  const firstStaticDataColumn = 1;// Номер столбца первых статических данных

  if (event["changeType"]!=="INSERT_ROW"){// Если тип изменения не равен "INSERT_ROW", то...
    return;// Прекратить выполнение функции
  };
  
  let activeRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourceSheetName).getActiveRange();// Получить активный диапазон в исходной таблице
  let rowBySelection = activeRange.getRow();// Получить номер строки по выделенному диапазону
  let insertRows = activeRange.getNumRows()// Получить количество вставленных строк

  let destinationSheet = SpreadsheetApp.openById(destinationSsId)
                    .getSheetByName(destinationSheetName1);

  // Получить диапазон данных в целевой таблице и переместить его в новую позицию
  destinationSheet//На чём работаем
  .getRange(//выделяем диапазон
      rowBySelection,/*!!!!!!!!!!!!!!если есть отступ, то увеличиваем,!!!!!!!!!!!!!*/
      firstStaticDataColumn,
      destinationSheet.getLastRow()-rowBySelection+1,
      destinationSheet.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(//перемещаем диапазон
    destinationSheet
      .getRange(
        rowBySelection+insertRows,/*!!!!!!!!!!!!!!тут тоже!!!!!!!!!!!!!*/
        firstStaticDataColumn,
        destinationSheet.getLastRow()-rowBySelection+1,
        destinationSheet.getLastColumn()-firstStaticDataColumn+2
      )
  )
  //-----------------------------//Лазер//---------------------------------//
  const destinationSheetName2 = "Лазер1";// Имя целевого листа
  let destinationSheet2 = SpreadsheetApp.openById(destinationSsId)
                    .getSheetByName(destinationSheetName2);
  
  destinationSheet2
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet2.getLastRow()-rowBySelection+1,
      destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet2
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet2.getLastRow()-rowBySelection+1,
        destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  )

[/vba]


Сообщение отредактировал AraB - Вторник, 06.06.2023, 16:50
 
Ответить
Сообщение
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 2 для запуска из исходной Таблицы 1. Т.е. надо будет из скрипта 2, находящегося в Таблице 1, обращаться к Таблице 2 как к внешнему объекту. Для этого надо будет переписать строку ссылки на нужный рабочий лист в другом файле в виде:

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

[vba]
Код

function onChanegTrigger(event){
  const destinationSsId = "1G7183qFCfhAt5tJqORrwNjq0_DlMEp2YzOfO9cUUbCI"// Идентификатор целевой таблицы
  const destinationSheetName1 = "Лист1";// Имя целевого листа
  const sourceSheetName = "Лист2";// Имя исходного листа
  const firstStaticDataColumn = 1;// Номер столбца первых статических данных

  if (event["changeType"]!=="INSERT_ROW"){// Если тип изменения не равен "INSERT_ROW", то...
    return;// Прекратить выполнение функции
  };
  
  let activeRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourceSheetName).getActiveRange();// Получить активный диапазон в исходной таблице
  let rowBySelection = activeRange.getRow();// Получить номер строки по выделенному диапазону
  let insertRows = activeRange.getNumRows()// Получить количество вставленных строк

  let destinationSheet = SpreadsheetApp.openById(destinationSsId)
                    .getSheetByName(destinationSheetName1);

  // Получить диапазон данных в целевой таблице и переместить его в новую позицию
  destinationSheet//На чём работаем
  .getRange(//выделяем диапазон
      rowBySelection,/*!!!!!!!!!!!!!!если есть отступ, то увеличиваем,!!!!!!!!!!!!!*/
      firstStaticDataColumn,
      destinationSheet.getLastRow()-rowBySelection+1,
      destinationSheet.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(//перемещаем диапазон
    destinationSheet
      .getRange(
        rowBySelection+insertRows,/*!!!!!!!!!!!!!!тут тоже!!!!!!!!!!!!!*/
        firstStaticDataColumn,
        destinationSheet.getLastRow()-rowBySelection+1,
        destinationSheet.getLastColumn()-firstStaticDataColumn+2
      )
  )
  //-----------------------------//Лазер//---------------------------------//
  const destinationSheetName2 = "Лазер1";// Имя целевого листа
  let destinationSheet2 = SpreadsheetApp.openById(destinationSsId)
                    .getSheetByName(destinationSheetName2);
  
  destinationSheet2
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet2.getLastRow()-rowBySelection+1,
      destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet2
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet2.getLastRow()-rowBySelection+1,
        destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  )

[/vba]

Автор - AraB
Дата добавления - 06.06.2023 в 16:49
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Google Docs » Автоматизация вызова скрипта в гугл таблицах (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!