Добрый день,уважаемые! Такая ситуация... Есть две гугл таблицы в одной хранятся данные про задачи: название задачи, время начала, конца, продолжительность. Эти данные импортируются во вторую таблицу (импортируются при помощи importrange) в которой, происходит дальнейшая работа с данными. При добавлении строк в таблицу, из которой берутся данные, во второй таблице просто изменялся размер вставляемого диапазона, но вписанные до этого данные и закраска не передвигались. Для решения этой проблемы были написаны два скрипта. Скрипт 1 - крепится к таблице из которой берутся данные, для его работы необходимо две ячейки - в одну он записывает значение первой ячейки столбца А, т.е. туда попадает следую значение после добавленной нами строки( тобишь значение, которое перемещается при добавлении строк), во вторую помещается количество добавленных строк. Второй скрипт, активируется при нажатии кнопки (она вынесена в меню сверху) и при нахождении нашего значения, которое мы определили при помощи первого скрипта, то он запоминает его и уже далее добавляет перед ним строки столько раз, сколько мы определили при помощи скрипта №1.
Необходимо, чтобы скрипт, который добавляет строки активировался автоматически при добавлении строк в таблице 1 (из которой берутся данные), как это сделать подскажите, пожайлуста
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 (из которой берутся данные), как это сделать подскажите, пожайлуста
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]
Подскажите пожайлуса, как автоматизовать вызов скрипта 2AraB
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 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.
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 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
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 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);
Мне кажется, Вам не надо разделять процесс по двум скриптам, а делать всё в "едином порыве". Я бы переписал скрипт 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);