Skrypt do generowania dokumentów Google od źródła danych, arkusza kalkulacyjnego Google

Original: http://opensourcehacker.com/2013/01/21/script-for-generating-google-documents-from-google-spreadsheet-data-source/

Microsoft Office obsługuje „źródeł danych, np.“ do generowania listów, faktur, naklejek adresowych i innych dokumentów opartych na szablonie powtarzania programu Microsoft Word i Microsoft Excel. danych Jest to bardzo powszechny problem małych firm i Urząd ma na to rozwiązanie, od połowy lat 90-tych. Aplikacje Google, chmura oparta alternatywę dla Microsoft Office, nie oferują podobną funkcjonalność natywnie (lub przynajmniej, jeśli robią to naprawdę dobrze ukryć). Można jednak dość łatwo stworzyć swój własny generator dokumentów za pomocą Google Apps skryptów tak długo, jak są biegli w programowaniu. W tym blogu pokażę przykład jak stworzyć taki skrypt i nauczyć się podstaw Skrypty Aplikacji Google.

1. Składniki generatora dokumentu

Mamy następujące następujące wejścia do naszego problemu biznesowego

Aplikacje Google kalkulacyjny zawierający dane klientów.
Szablon dokumentu Aplikacji Google docs. W oparciu o to, że chcemy, aby wygenerować dokument dla każdego klienta poprzez wypełnienie tego dokumentu szablon z danymi z arkusza kalkulacyjnego.
Folder Dysk Google, gdzie przechowywane są dokumenty wynikowe.
Skrypt Google Apps, które automatyzacja zadanie dla nas (w oparciu Javascript)
W moim przypadku sprawa wykorzystano generowanie tekstów umów dla klientów w oparciu o ich cenie i jakości danych usług. Potem po prostu wywiezione i e-maila otrzymanego Dokumentów Google w formacie PDF.

Wszystkie te są przechowywane na koncie Google Apps w Google Drive. Wszystko dzieje się za pośrednictwem interfejsu do edycji użytkownika Aplikacji Google, potrzebne żadne narzędzia zewnętrzne.

Przykład danych źródłowych (ukrywane przy obfuscate.js)

 

 

 

 

 

 

 

Przykład dokumentu szablonu (ukrywane przy obfuscate.js). Widać etykiety źródłowych, niewypełnione.

 

Przykład otrzymanego dokumentu – Etykiety wypełnione i nie pogrubione (ukrywane przy obfuscate.js)

Przykład otrzymanego dokumentu – Etykiety wypełnione i nie pogrubione (ukrywane przy obfuscate.js)

2. Krótkie wprowadzenie do Google Apps Script

Skrypty Aplikacji Google mogą być wywoływane na dwa sposoby

Sterownik z interfejsem użytkownika Google (Dodaj nowy … więcej … Script)
Bezpośrednio z arkusza kalkulacyjnego Google Apps (nie jest pozycja menu)
więcej
Istnieje również zintegrowany fragment Usługa udostępniania publicznego kalkulacyjny Google UI naprawdę … choć pozostawia pole do poprawy tutaj. Możesz też sprzedać skrypty w Google Chrome Web Store.
Dlatego, że nie pracują na arkuszu musimy użyć byłego podejście.

 

Google Apps Script jest (wersja ECMAScript nieokreślony? Czy uruchomić V8?) Chmura skryptowego języka JavaScript, który zapewnia łatwe sposoby automatyzacji zadań w całej produktów Google i usług osób trzecich.Google Apps Script posiada obszerną dokumentację API wraz z przykładami i ćwiczenia, ale nadal są znacznie ulec zmianie, jak prawie wszystko jest oznaczone jako eksperymentalne i już istnieje wiele przestarzałych metod. Skrypty Aplikacji Google mogą również uzyskać dostęp do Google Maps, kontakty, e-mail, strony, ustawienie domeny Google Apps iw zasadzie mają rozwiązania automatyki prawie wszystko można zrobić w chmurze Google.

Skrypt jest wykonywany na stronie serwera i masz interfejs użytkownika oparty nie fantazyjne zlokalizowane przeglądarka jest do edycji i debugowania skryptu.

 

Filozofii i projektowania interfejsu użytkownika Wzorce ochotę cofnąć się do lat 90., do środowiska programu Visual Basic skryptów. Może programiści Google Apps chciał tego … tak, że Visual Basic programiści czują do domu. Jednakże, pochodzących z tworzenia stron WWW, JavaScript i ogólnym tle programowania znajdziesz brak Firebug / Web Inspector jak konsoli niepokojącego. Nie czuję się jak każdy inny rozwój JavaScript, choć z pewnością składnia jest taka sama.

Tak więc my drobne podnosi obejmują, ale nie są do nich ograniczone

Logowanie z aplikacji jest możliwe, ale trasa jest bardzo nieczytelny dziennik w interfejsie użytkownika
Program nie ma określonego punktu wejścia, należy wybrać funkcję za pomocą widgetu wyboru. To sprawia, że czują się jak skrypt zabawki.
Debugger (i brak konsoli) nie wydaje się, aby umożliwić modyfikację i dynamicznie Kapsa obiektów w czasie działania programu (funkcje połączeń, itp.)
Debugger jest nieco powolny (w obie strony na serwerach Google, bit), choć nadal dość dużo użyteczny
Brak niskiej klasy narzędzi interakcji użytkownika w samodzielny skryptów (patrz poniżej)
Dokumenty API i rzeczywistość nie zawsze pasują (jak wszystko jest wciąż w fazie eksperymentalnej)
Debugger w akcji

Mogło być lepiej, ale w końcu udało mi się zrobić to, czego się szuka, a ja wciąż nie płacąc ani grosza dla Google Apps, więc jestem zadowolony. Ponadto, nie chcę wracać do pakietu Microsoft Office, chyba muszę napisać dobrze sformatowane dokumenty drukowania … Dokumenty Google to zabawka, co przychodzi do ciężkich i wrażliwych dokumentów authoringu graficznie jak oferty …. Lub prezentacje Keynote … gdzie jest król.

3. Skrypt generatora

Na początku trzeba skryptu stałe, które określają, w którym dane do obsługi. Można zbudować interfejs użytkownika, czyniąc skrypt do pełnej aplikacji internetowej, ale jest to zbyt kłopotliwe podejście do tak małego zadania.Budowniczy interfejs wydawał się miły, ale na pewno przesada. Choć istnieją metody API Google Apps Script do wykonywania prostego wiersza () pytanie w przeglądarce, z jakiegoś powodu nie były one wspierane w samodzielny skryptów … tak najszybszy podejście do wprowadzania danych do skryptu po prostu edytować sam skrypt przed każdym biegu. I taaak zaczęła przegap wiersza polecenia … po raz pierwszy w moim życiu.

Tak więc, na początku skryptu definiujemy dane źródłowe

Arkusz kalkulacyjny ID (można je odebrać z adresu URL podczas edycji dokumentu)
Identyfikator dokumentu szablon (można go odebrać z adresu URL podczas edycji dokumentu)
ID klienta, które jest numer wiersza arkusza kalkulacyjnego, w bieżącym okresie skryptu
Id folder sterownika Google, gdzie powstały dokument zostanie umieszczony w zakresie udostępniania. Znowu można wybrać identyfikator z adresu URL podczas otwierania folderu.
Następnie skrypt po prostu zastępuje słowa z danych.Słów kluczowych, które mają być zastąpione w dokumencie szablonu są identyfikowane jako etykiety kolumn (wiersz 1) w danych w arkuszach kalkulacyjnych. Jestem całkiem pewien, że byłoby bardziej skuteczne metody, aby to zrobić, ale nie chcą spędzić czas, aby przejść do kolana głęboko do GS, aby dowiedzieć się jego niuanse.

A następnie skrypt … prosimy modyfikować do własnych potrzeb (generator.gs):

/**
 * Generate Google Docs based on a template document and data incoming from a Google Spreadsheet
 *
 * License: MIT
 *
 * Copyright 2013 Mikko Ohtamaa, http://opensourcehacker.com
 */// Row number from where to fill in the data (starts as 1 = first row)var CUSTOMER_ID =1;// Google Doc id from the document template// (Get ids from the URL)var SOURCE_TEMPLATE ="xxx";// In which spreadsheet we have all the customer datavar CUSTOMER_SPREADSHEET ="yyy";// In which Google Drive we toss the target documentsvar TARGET_FOLDER ="zzz";/**
 * Return spreadsheet row content as JS array.
 *
 * Note: We assume the row ends when we encounter
 * the first empty cell. This might not be 
 * sometimes the desired behavior.
 *
 * Rows start at 1, not zero based!!! :( 
 *
 */function getRowAsArray(sheet, row){
  var dataRange = sheet.getRange(row,1,1,99);
  var data = dataRange.getValues();
  var columns =[];

  for(i in data){
    var row = data[i];

    Logger.log("Got row", row);

    for(var l=0; l<99; l++){
        var col = row[l];
        // First empty column interrupts
        if(!col){
            break;
        }

        columns.push(col);
    }
  }

  return columns;}/**
 * Duplicates a Google Apps doc
 *
 * @return a new document with a given name from the orignal
 */function createDuplicateDocument(sourceId, name){
    var source =DocsList.getFileById(sourceId);
    var newFile = source.makeCopy(name);

    var targetFolder =DocsList.getFolderById(TARGET_FOLDER);
    newFile.addToFolder(targetFolder);

    returnDocumentApp.openById(newFile.getId());}/**
 * Search a paragraph in the document and replaces it with the generated text 
 */function replaceParagraph(doc, keyword, newText){
  var ps = doc.getParagraphs();
  for(var i=0; i<ps.length; i++){
    var p = ps[i];
    var text = p.getText();

    if(text.indexOf(keyword)>=0){
      p.setText(newText);
      p.setBold(false);
    }
  }}/**
 * Script entry point
 */function generateCustomerContract(){

  var data =SpreadsheetApp.openById(CUSTOMER_SPREADSHEET);

  // XXX: Cannot be accessed when run in the script editor?
  // WHYYYYYYYYY? Asking one number, too complex?
  //var CUSTOMER_ID = Browser.inputBox("Enter customer number in the spreadsheet", Browser.Buttons.OK_CANCEL);
  if(!CUSTOMER_ID){
      return; 
  }

  // Fetch variable names
  // they are column names in the spreadsheet
  var sheet = data.getSheets()[0];
  var columns = getRowAsArray(sheet,1);

  Logger.log("Processing columns:"+ columns);

  var customerData = getRowAsArray(sheet, CUSTOMER_ID);  
  Logger.log("Processing data:"+ customerData);

  // Assume first column holds the name of the customer
  var customerName = customerData[0];

  var target = createDuplicateDocument(SOURCE_TEMPLATE, customerName +" agreement");

  Logger.log("Created new document:"+ target.getId());

  for(var i=0; i<columns.length; i++){
      var key = columns[i]+":"; 
      // We don't replace the whole text, but leave the template text as a label
      var text = customerData[i]||"";// No Javascript undefined
      var value = key +" "+ text;
      replaceParagraph(target, key, value);
  }}

Comments are closed.