Копирование данных из листов в документы и создание нового документа - PullRequest
2 голосов
/ 03 октября 2019

Я нахожусь в том состоянии от начального до среднего в программировании, где я знаю достаточно, чтобы собрать воедино что-то, что может быть довольно сложным, но, возможно, я не делаю этого наилучшим образом, получаю тупик, и это определенно не оптимизировано.

Я создал генератор счетов-фактур, который берет данные, введенные с листа, и переводит их в тот же шаблон в документах Google. Я хочу иметь скрипт, который берет информацию о кавычках и копирует строки в шаблон в документах, если строка не пуста, и в этом случае она переходит к следующему.

Пока я достигэто путем указания каждой ячейки в качестве независимой переменной и копирования их по отдельности, независимо от того, заполнены они или нет.

Это работает, но это не кажется наиболее эффективным решением, и довольно быстро становится болью, так какнам все еще нужно исправить форматирование в сгенерированном документе с цитатами.


  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sinput = ss.getSheetByName("QUOTE TEMPLATE");

//TO GENERATE DOCUMENT
  var templateId = '1jIxHUZAoVd00a9eTZM-ORL0H7qMLfEmyat04l89GNwE';

  //devis
  var item1 = sinput.getRange("B18").getValues();
  var item2 = sinput.getRange("B19").getValues();
  var item3 = sinput.getRange("B20").getValues();

  var qty1 = sinput.getRange("C18").getValues();
  var qty2 = sinput.getRange("C19").getValues();
  var qty3 = sinput.getRange("C20").getValues();

  var unitprice1 = sinput.getRange("D18").getValues();
  var unitprice2 = sinput.getRange("D19").getValues();
  var unitprice3 = sinput.getRange("D20").getValues();

  var total1 = sinput.getRange("E18:G18").getValues();
  var total2 = sinput.getRange("E19:G19").getValues();  
  var total3 = sinput.getRange("E20:G20").getValues();


//Make a copy of the template file
  var documentId = DriveApp.getFileById(templateId).makeCopy().getId();

//Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

//All the text to be replaced

  body.replaceText('%DESCRIPTION_STRING1%', item1 );
  body.replaceText('%DESCRIPTION_STRING2%', item2 );
  body.replaceText('%DESCRIPTION_STRING3%', item3 );;

  body.replaceText('%Q1%', qty1 );
  body.replaceText('%Q2%', qty2 );
  body.replaceText('%Q3%', qty3 );

  body.replaceText('%PRIC1%',  unitprice1 );
  body.replaceText('%PRIC2%',  unitprice2 );
  body.replaceText('%PRIC3%',  unitprice3);;

  body.replaceText('%TOTAL_1%', total1 );
  body.replaceText('%TOTAL_2%',  total2);
  body.replaceText('%TOTAL_3%', total3 );;

}

Это сокращенная версия, поскольку исходный код учитывает 20 различных строк ввода, может быть, больше. В настоящее время любые пустые ячейки приводят к экспорту запятой (,) в документ Google.

Я бы хотел:

  1. уменьшить длину кода
  2. сделать код быстрее
  3. создать код для пропуска пустых строк
  4. используйте что-то, что не body.replaceText

, но я не могу понять, как правильно выразить "если строка пуста, просто перейти к следующему биту" в коде.

У меня за плечами около 6 месяцев опыта, поэтому я считаю себя все еще очень большим учеником. Любая помощь или понимание приветствуется!

1 Ответ

1 голос
/ 04 октября 2019

Попробуйте это:

function fn(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3");
  var data = ss.getRange("B18:G20").getValues();

//Make a copy of the template file
  var documentId = DriveApp.getFileById(templateId).makeCopy().getId(); 
//Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

//All the text to be replaced
  body.replaceText('%DESCRIPTION_STRING1%', data[0][0]);
  body.replaceText('%DESCRIPTION_STRING2%', data[1][0]);
  body.replaceText('%DESCRIPTION_STRING3%', data[2][0]);

  body.replaceText('%Q1%', data[0][1]);
  body.replaceText('%Q2%', data[1][1]);
  body.replaceText('%Q3%', data[2][1]);

  body.replaceText('%PRIC1%',  data[0][2] );
  body.replaceText('%PRIC2%',  data[1][2]);
  body.replaceText('%PRIC3%',  data[2][2]);

  body.replaceText('%TOTAL_1%', data[0][3] + " " + data[0][4] + " " + data[0][5]);
  body.replaceText('%TOTAL_2%', data[1][3] + " " + data[1][4] + " "  + data[1][5]);
  body.replaceText('%TOTAL_3%', data[2][3] + " " + data[2][4] + " " + data[2][5]);
}

Я предположил, что для итогов вы хотели бы сумму значений в этих ячейках, если это не так, пожалуйста, дайте мне знать, и я обновлю свой код,

Что касается того, что вы сделали, в соответствии с Best Script Apps Apps Best Practices , вам следует избегать многократных обращений к API, поскольку они являются наиболее тяжелыми методами, которые вы будете использовать (getValue() в частности, в вашем случае). Идеальная вещь - получить значения один раз, используя getValues(), и работать с возвращаемым 2D-массивом ( Документация здесь )

Другое дело, когда вы вызываете body.replaceText('%DESCRIPTION_STRING1%', item1 ), item1, item2 & item3 были все двумерные массивы, поэтому их использование не заменило бы, поэтому я спросил, что вы хотите с ними делать.

Наконец, я думаю, что альтернативой body.replaceText() будет извлечение текста тела и выполнение всех поисков в этой строке, а затем замена всего тела на результат. Это будет означать меньше обращений к API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...