Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.02.2016, 12:14
Аватар для fenix_63
Аспирант
Отправить личное сообщение для fenix_63 Посмотреть профиль Найти все сообщения от fenix_63
 
Регистрация: 05.06.2014
Сообщений: 92

Не передаётся массив в функцию
Всем привет! Народ, вот такая вот проблема. Нужно чтобы при редактировании ячейки в 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, файл Код)

Я уже голову сломал, не знаю что тут делать, помогите пожалуйста.
Ответить с цитированием
  #2 (permalink)  
Старый 24.02.2016, 01:42
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

var ss=SpreadsheetApp.getActiveSpreadsheet();

Это какой-то Гугловский АПИ? Осмелюсь предположить, что проблема в синхронности вызовов. То есть, на момент вызова record_in_table(arr), требуемый массив arr ещё не сформирован. Проверьте последовательность вызовов в консоли отладки, расставив точки остановки (debugger;) или логированием на ключевых точках логики (console.log("");)
Ответить с цитированием
  #3 (permalink)  
Старый 24.02.2016, 16:02
Аватар для fenix_63
Аспирант
Отправить личное сообщение для fenix_63 Посмотреть профиль Найти все сообщения от fenix_63
 
Регистрация: 05.06.2014
Сообщений: 92

Да, походу гугловский API, который сильно похож на JavaScript. В общем эту проблему то я уже решил, но теперь появилась другая )) Не могу понять как обработать событие когда пользователь меняет значение в выпадающем списке, который находится в ячейке.
Ответить с цитированием
  #4 (permalink)  
Старый 24.02.2016, 16:03
Аватар для fenix_63
Аспирант
Отправить личное сообщение для fenix_63 Посмотреть профиль Найти все сообщения от fenix_63
 
Регистрация: 05.06.2014
Сообщений: 92

Google Apps Script это если быть точным )
Ответить с цитированием
  #5 (permalink)  
Старый 24.02.2016, 18:25
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

Сообщение от fenix_63 Посмотреть сообщение
Не могу понять как обработать событие когда пользователь меняет значение в выпадающем списке, который находится в ячейке.

Как это у Гугла реализовано не знаю - это к документации Гугла.
А в jQuery например так.

Последний раз редактировалось dismantled, 24.02.2016 в 18:29.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальная переменная: не передается новое значение через функцию armidoll Общие вопросы Javascript 7 29.05.2015 21:54
Не передается параметр в функцию Velidan Общие вопросы Javascript 3 13.02.2015 15:32
Распаковать массив для передачи аргументов в функцию. dimy44 Общие вопросы Javascript 2 02.02.2015 17:36
Массив передается как undefined. Pumych Events/DOM/Window 11 09.02.2011 14:05
Подскажите пожалуйста как передать массив в функцию serov Элементы интерфейса 3 21.08.2010 19:37