понедельник, 10 апреля 2017 г.

Google Drive. Отчет с данными из таблицы. Создание простенькой БД. Часть 1


Думаю все знают про Google Drive (Google Docs), и многие наверное знают про Google Apps Script, если кто не знает можете почитать, вкратце это API для документов Google. Представляю еще один способ как использовать Google Spreadsheet (Таблицы) и Google Doc (Документ), для формирования документов с данными из таблицы.

Для тех кто впервые узнал о GAS (Google Apps Script) советую почитать Getting Started with Google Apps Script

Задача: Автоматизировать процесс создания документов.
Решение:

1. Открыть базу, найти нужные данные;
2. Создать копию шаблона;
3. Заполнить скопированный шаблон;

Для хранения данных будем использовать Таблицы, для хранения шаблона будем использовать Документ.
Документ — содержит отформатированный текст документа для выдачи клиенту, в котором данные клиента хранятся в переменных (в моем случае использовались такие переменные: ).

В таблицах будем хранить сами данные в такой структуре:


Для примера шаблона возьмем текст:


Пара слов о ID, в Диске у каждого объекта свой ID и получить его можно взглянув на строку браузера при открытом объекте (Документе, Таблице, Папке):


Ниже код, думаю он достаточно комментирован, прошу простить за мой французский английский. Входная точка скрипта doAction():
function doAction() {

 var result = ReadBaseData("31-05-2012");
 //If found data for this date...
 if (result != null ) {
  var doc = CreateNewDoc("Act from " + result[0][0]);
  FillTemplate(doc, result);
 }
}
//inDoc - its a empty template, inData - data for filling template
function FillTemplate(inDoc, inData) {
 //Getting count of files in folder
 var NUM = DocsList.getFolderById(FOLDER_ID).getFiles().length;

 //Replace masks (Don't work [NUM] or $NUM or something else)
 inDoc.replaceText("<NUM>", NUM + 1);
 inDoc.replaceText("<DATE>", Utilities.formatDate(inData[0][0], "GMT""dd.MM.yyyy"));

 //get first table in document
 var table = curDoc.getTables()[0];
 for (i=0; i< inData.length; i++) {
  var row = table.appendTableRow();
  row.appendTableCell(inData[i][1]);
  row.appendTableCell(inData[i][2]);
 }
 curDoc.saveAndClose();

}
function CreateNewDoc(docName) {
 //Making copy of blank file
 var blankDoc = DocsList.getFileById(BLANK_DOC_ID).makeCopy(docName);
 blankDoc.addToFolder(DocsList.getFolderById(FOLDER_ID));

 //return working doc and table base
 return curDoc = DocumentApp.openById(blankDoc.getId());
}
//get range and sort only for day from parameter
function ReadBaseData(inDate) {
 var ssDoc = SpreadsheetApp.openById(BASE_TABLE_ID).getActiveSheet();

//get filled range
 var data = ssDoc.getDataRange().getValues();

 //create new array with data to inDate,
 //for start from 1 because first row is text column headers
 var filteredData = new Array( new Array() );
 for (i=1; i< data.length; i++) {
  data[i][0] = convertDate(data[i][0]);
  if (data[i][0] == inDate && data[i][3] == 1) {
   filteredData[i-1] = data[i];
  }
 }
 return filteredData;


* This source code was highlighted with Source Code Highlighter.

В финале получаем новый документ в папке с Актами

и заполненный данными с Таблицы

Таким образом можно автоматизировать простую выдачу счетов или актов в небольшой конторе, без установки прикладного софта.

Если будет интересно, могу продолжить в следующей статье о GUI.

Спасибо за внимание!

0 коммент.:

Отправить комментарий