Google Apps Script - как ссылаться на объект в цикле в функции - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь создать небольшую систему организации выставления счетов-фактур, используя Google Sheets / Drive. У меня есть один лист, который я называю «задачами», из которого я планирую все контролировать. Некоторые из моих столбцов включают: «Клиент», «Проект», «Требования», «Детали», «Субподрядчик» ... По мере приобретения новых задач / клиентов я найду и добавлю информацию, соответствующую задаче («Проект»). "," Требования ") к другим листам или, если их нет, создайте папки, листы и добавьте соответствующую необходимую информацию из листа" задач "к новым листам. Некоторые листы будут отправлены субподрядчикам в зависимости от того, были ли обновлены их задачи или им были назначены новые на исходном листе «задач».

На листах, которые я отправляю субподрядчикам, будут поля для заполнения (ставка, эта ...), после заполнения я отправлю эту информацию на третий лист, чтобы применить некоторые наценки, дополнительные сборы, а затем отправить информацию обратно на исходный лист «задач», где она заполнит соответствующие ячейки. Как только вся необходимая информация в строке заполнена, она будет подготовлена ​​и организована в счет-фактуру для клиента, указанного в столбце «клиент» ...

В любом случае, я пытался изучить javascript для реализации всего этого. Поскольку я планирую создавать папки, листы и добавлять информацию на основе значений, введенных в строках и столбцах листа «Задачи» ... Я поместил цикл for в функцию onEdit, которая выполняет следующие действия:

    function onEdit(e) {

      var ss = e.range.getSheet().getParent();
      var sheet = e.range.getSheet();
      var row = e.range.getRow();  
      var columns = [1, 2, 3, 4, 5, 6, 7, 8, 9];


       //assign titles as 'keys' to array
       var titles = []

       //assign values of edited row to array
       var values = []

       //create an object to associate the title to the new edited values
       var task = {}



       for(var i in columns){

         titles.push(sheet.getRange(1, columns[i]).getValue());  //push titles
         values.push(sheet.getRange(row, columns[i]).getValue()); //push values of updated row
         task[titles[i]] = values[i]; //add the values to their property names in task object

       }

Это работает, и я могу ссылаться на задачу ["Клиент"], но я хотел бы поместить этот цикл в функцию, чтобы я мог использовать его снова. Я полагаю, что я мог бы обойтись без этого, но массив «столбцы» представляет только столбцы, которые я буду вводить в «первом раунде» --- когда я отправляю информацию ... Я буду вводить новую информацию в столбцы 10-15, затем 16-20, по мере выполнения задач ... и я хотел бы запустить цикл for для этих столбцов без необходимости создавать отдельные циклы. Для этого я создал функцию GetInfo ниже:

   function GetInfo(row,column){

   for(var i in column){

     titles.push(sheet.getRange(1, column[i]).getValue());  //push titles
     values.push(sheet.getRange(row, column[i]).getValue()); //push values of updated row
     this.task[titles[i]] = values[i]; //add the values to their task

   }
  }

То, что я пытаюсь выполнить, похоже на то, что обрисовано в общих чертах здесь . Тем не менее, "for (var..in ..") не упоминается в примерах, и я думаю, что я что-то упустил. При попытке использовать функцию для первого массива столбцов я сделал это:

var list = new GetInfo(row,columns);

Я хотел бы сослаться на задачу следующим образом

list.task["client"]

Или var.task ["name"], но вышеприведенное не работает. Когда я принимаю тост за list.task ["Клиент] или пытаюсь добавить его в другую ячейку, ничего не происходит - оно пустое. Что я делаю не так? Как мне сделать это правильно? Что мне делать?

Любая помощь или руководство будет принята с благодарностью. пожалуйста.

(другие тосты работают, и соответствующая ячейка не пустая, без функции for var in works)

...