Добавить значение одной ячейки в первый ряд массива, который пишется с помощью скрипта Google - PullRequest
0 голосов
/ 13 февраля 2020

Цель :
Используйте Google Script для записи данных с одного листа на другой лист «базы данных».

Текущее состояние :
Когда вкладка «Форма» заполнена и нажата зеленая кнопка, запускается скрипт, который записывает данные из «Формы» в « Вкладка «Изменение БД заказов» или «БД позиций». Запись данных на вкладку «БД изменений порядка» работает по желанию, никаких проблем. Запись данных на вкладку «Элемент БД» не удалась.

Обнаружена проблема :
Строки 10-50 на вкладке "Форма" должны быть записаны на вкладку "БД элемента строки" при запуске сценария. Я хотел бы добавить идентификатор #, найденный на вкладке формы B7, который будет добавлен к каждой строке записываемого массива. Я приложил скриншот, который показывает желаемые результаты. Сценарий должен записать данные на вкладку «БД», как показано на скриншоте. Столбец A - это порядковый номер изменения (из ячейки B7 на вкладке формы, а затем каждая строка представляет собой массив из строк 10-50. enter image description here

Текущий сценарий :

function SubmitChangeOrder() {
         var sheet = SpreadsheetApp.getActiveSpreadsheet();  
         var sheet = SpreadsheetApp.getActiveSpreadsheet();
         var form = sheet.getSheetByName('Form');
         var codb = sheet.getSheetByName('Change Order DB');
         var lidb = sheet.getSheetByName('Line Item DB');

         var lirows = form.getLastRow();
         var lineitems = form.getRange(10,1,lirows,3);
         var lidestination = lidb.getRange(lidb.getLastRow()+1,2,lirows,3);
         var sourcedata = lineitems.getValues();

         var date = form.getRange('E7').getValue();
         var customer = form.getRange('B3').getValue();
         var re = form.getRange('B5').getValue();
         var coid = form.getRange('B7').getValue();
         var total = form.getRange('G5').getValue();
         var status = form.getRange('G3').getValue();
         var codestination = codb.getRange(codb.getLastRow()+1,1,1,6);


         codestination.setValues([ [coid, date, customer, re, total, status] ]);
         lidestination.setValues(sourcedata);

}

Script Issue :
Последняя часть кода, lidestination.setValues(sourcedata); правильно записывает данные из строк 10-50, я просто хотел бы добавить ID # в каждую строку что пишется.

У меня есть лист Google с несколькими вкладками. ссылка на пример

1 Ответ

2 голосов
/ 13 февраля 2020

Вам необходимо через l oop через массив sourcedata добавить coid в начало каждого вложенного массива. Есть несколько способов сделать это, но я решил создать новый массив, используя concat(). (Учитывая имя переменной, я бы предположил, что она не должна изменяться, поскольку в противном случае она не была бы «источником».)

Я сделал несколько других небольших изменений в вашем коде, которые вы можете увидеть в комментариях , Самое главное, что исходный код смешивал getLastRow() с параметром numRows, необходимым для getRange().

function SubmitChangeOrder() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var form = sheet.getSheetByName('Form');
  var codb = sheet.getSheetByName('Change Order DB');
  var lidb = sheet.getSheetByName('Line Item DB');

  const li_start_row = 10; // Use a variable for clarity
  var numRows = form.getLastRow() - li_start_row + 1; // Calculate the number of line item rows
  var lineitems = form.getRange(li_start_row,1,numRows,3); // Select number of rows, not the row limit
  var lidestination = lidb.getRange(lidb.getLastRow()+1,1,numRows,4); // 4 columns, because adding Change Order #
  var sourcedata = lineitems.getValues();

  var date = form.getRange('E7').getValue();
  var customer = form.getRange('B3').getValue();
  var re = form.getRange('B5').getValue();
  var coid = form.getRange('B7').getValue();
  var total = form.getRange('G5').getValue();
  var status = form.getRange('G3').getValue();
  var codestination = codb.getRange(codb.getLastRow()+1,1,1,6);

  // Create a new table with sourcedata, but with the Change Order #
  // added to the beginning of each row
  var li_db_values = [];
  for (var i = 0; i < sourcedata.length; i++) {
    li_db_values.push([coid].concat(sourcedata[i]));
  }

  codestination.setValues([ [coid, date, customer, re, total, status] ]);
  lidestination.setValues(li_db_values);
}

Еще немного может сделать, чтобы очистить ваш код и повысить производительность. Если у вас есть время, я настоятельно рекомендую ознакомиться с лучшими практиками, а именно с разделом Пакетные операции .

...