Не передаётся массив в функцию
Всем привет! Народ, вот такая вот проблема. Нужно чтобы при редактировании ячейки в Google-таблице срабатывала функция.
Я передаю в качестве параметра функции - двумерный массив, но вот почему то 2-ю размерность массива функция ну ни в какую воспринимать не хочет :( Подскажите, что не так? Ссылка на Google-таблицу: https://docs.google.com/spreadsheets...it?usp=sharing Скрипт: function onEdit(event){ var ss=SpreadsheetApp.getActiveSpreadsheet();//Получили активный документ (активную таблицу) var sheet = ss.getActiveSheet();//получаем активный лист,например "Отправили КП", "В работе", и т.д. Из ячеек активного листа //данные надо копировать на лист "Данные" //Получаем активную (редактируемую) ячейку var range=SpreadsheetApp.getActiveRange();//Изменяемая ячейка var curRow=range.getRowIndex();//Текущий номер строки var curCol=range.getColumn();//Текущий номер столбца var arr = new Array(1000);//Массив из 1000 строк - туда сохраняем данные строки var range;// = sheet.getRange(1,1); var count=0; var i=6;//Данные начинаются с 6-й строки, поэтому просмотр начинаем с 6. Как только строка пустая - останавливаем счёт //Это нужно для того, чтобы знать, сколько строк выделять под массив. Столбцов будет около 17-19 (по наибольшей таблице) while(i<1000 && sheet.getRange(i,2).getValue()!="") { count++; i++; } //range=sheet.getRange(1,1).setValue(count); for(var k=0;k<count;k++) { arr[k]=new Array(18);//В кажой строке 16 столбцов. Всего count строк for(var i=0;i<19; i++) { range=sheet.getRange(6,i+1); var data = range.getValue(); arr[k][i]=data; //sheet.getRange(2,i+1).setValue(arr[k][i]);//Вывод массива в ячейки для тестирования } } //sheet.getRange(1,1).setValue(findInColumn("B",15)); //sheet.getRange(1,1).setValue(arr[0][1]); record_in_table(arr); } //Передаём в функцию наш заполненный массив. function record_in_table(arr) { var ss=SpreadsheetApp.getActiveSpreadsheet();//Получили активный документ (активную таблицу) //Копируем данные из "Отправили КП" в "Данные" var sheet = ss.getSheetByName("Данные");//получаем лист по его названию,например "Данные", "Отправили КП", "В работе" //Теперь надо определить, в какую именно строку заносить данные //Надо взять из массива значение arr[0][1], arr[1][1], arr[2][1] и т.д. - это значения индексов, в по этим индексам вставлять в таблицу "Данные" //все остальные значения //var index=arr[0][1]; //Теперь во вкладке "Данные" надо найти этот индекс, таким образом мы определим, какую строку надо обновить //var columnValues=sheet.getRange("A1:A20");//По мере заполнения таблицы диапазон будет меняться for(var j=0; j<arr.length; j++) { var index=findInColumn("A",arr[j][1]);//Если вернулось какое то значение - значит идёт обновление данных, //если вернулось "-1", значит будет добавление данных в лист "Данные", т.е. добавление полностью новой строки if(index!=-1) { var range=sheet.getRange(index,3).setValue(arr[j][2]);//Дата поступления range=sheet.getRange(index,6).setValue(arr[j][5]);//Название компании range=sheet.getRange(index,8).setValue(arr[j][10]);//Комментарий range=sheet.getRange(index,12).setValue(arr[j][9]);//Первичный запрос range=sheet.getRange(index,14).setValue(arr[j][11]);//Телефон range=sheet.getRange(index,16).setValue(arr[j][6]);//Контактное лицо range=sheet.getRange(index,17).setValue(arr[j][7]);//Должность контактного лица range=sheet.getRange(index,18).setValue(arr[j][8]);//Имя директора range=sheet.getRange(index,20).setValue(arr[j][13]);//Ожидаемая сумма сделки range=sheet.getRange(index,21).setValue(arr[j][14]);//Реальная сумма сделки range=sheet.getRange(index,22).setValue(arr[j][15]);//Стратегия на пол года range=sheet.getRange(index,23).setValue(arr[j][16]);//Дата оплаты } else { //Тут надо вызвать функцию добавления новой строки в лист "Данные" из массива arr[][] //AddrRow(arr); } }//for } function AddRow(arr) { var ss=SpreadsheetApp.getActiveSpreadsheet();//Получили активный документ (активную таблицу) //Копируем данные из "Отправили КП" в "Данные" var sheet = ss.getSheetByName("Данные");//получаем лист по его названию,например "Данные", "Отправили КП", "В работе" //Ищем индекс строки для вставки - это первая свободная строка таблицы "Данные" var index=1; while(index<=1000 && sheet.getRange(index,3).getValue()!="") index++; var range=sheet.getRange(index,3).setValue(arr[0][2]);//Дата поступления range=sheet.getRange(index,6).setValue(arr[0][5]);//Название компании range=sheet.getRange(index,8).setValue(arr[0][10]);//Комментарий range=sheet.getRange(index,12).setValue(arr[0][9]);//Первичный запрос range=sheet.getRange(index,14).setValue(arr[0][11]);//Телефон range=sheet.getRange(index,16).setValue(arr[0][6]);//Контактное лицо range=sheet.getRange(index,17).setValue(arr[0][7]);//Должность контактного лица range=sheet.getRange(index,18).setValue(arr[0][8]);//Имя директора range=sheet.getRange(index,20).setValue(arr[0][13]);//Ожидаемая сумма сделки range=sheet.getRange(index,21).setValue(arr[0][14]);//Реальная сумма сделки range=sheet.getRange(index,22).setValue(arr[0][15]);//Стратегия на пол года range=sheet.getRange(index,23).setValue(arr[0][16]);//Дата оплаты } //Функция ищет позицию данных data в указанном столбце column, и возвращает индекс той строки, где встретились указанные данные data function findInColumn(column, data) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Данные"); var column = sheet.getRange(column + ":" + column); // like A:A var values = column.getValues(); //Получаем все значения столбца column var row = 0; while ( values[row] && values[row][0] !== data ) { row++; } if (values[row][0] === data) return row+1; else return -1; } Триггеры настроил на изменение таблицы. Ошибка вылазиет вот тут: var index=findInColumn("A",arr[j][1]); Google-script пишет TypeError: Не удается прочитать свойство "1" объекта undefined. (строка 73, файл Код) Я уже голову сломал, не знаю что тут делать, помогите пожалуйста. |
var ss=SpreadsheetApp.getActiveSpreadsheet(); Это какой-то Гугловский АПИ? Осмелюсь предположить, что проблема в синхронности вызовов. То есть, на момент вызова record_in_table(arr), требуемый массив arr ещё не сформирован. Проверьте последовательность вызовов в консоли отладки, расставив точки остановки (debugger;) или логированием на ключевых точках логики (console.log("");) |
Да, походу гугловский API, который сильно похож на JavaScript. В общем эту проблему то я уже решил, но теперь появилась другая )) Не могу понять как обработать событие когда пользователь меняет значение в выпадающем списке, который находится в ячейке.
|
Google Apps Script это если быть точным )
|
Цитата:
Как это у Гугла реализовано не знаю - это к документации Гугла. А в jQuery например так. |
Часовой пояс GMT +3, время: 15:29. |