Skript pro generování dokumentů Google z tabulky dat Google zdroji

OBSAH

1. Složení dokumentu generátoru

2. Krátký úvod do Google Apps Script

3. Generátor skriptu

 
Microsoft Office podporuje "Zdroje dat", jak generovat např. dopisy, faktury, adresy samolepky a další opakující se dokumenty založené na šabloně aplikace Microsoft Word a Microsoft Excel data. To je velmi častý problém pro malé podniky a kanceláře má řešení pro něj z poloviny 90. let. Google Apps, cloud alternativa k Microsoft Office, nenabízejí podobné funkce nativně (nebo alespoň pokud ano skrývají to opravdu dobře).Však můžete poměrně snadno vytvořit svůj vlastní dokument generátor pomocí služby Google Apps skriptování tak dlouho, jak vaše jsou zdatní v programování. V tomto blogu budu ukázat příklad, jak vytvořit takový skript a naučit se základy skriptech Google Apps.

1. Složení dokumentu generátoru

Jsme po následující vstupy pro naše obchodní problém

  • Google Apps tabulkový procesor, který obsahuje data o zákaznících.
  • Google Apps dokumenty šablony dokumentu. Na základě toho chceme vytvořit dokument pro každého zákazníka vyplněním tohoto vzorový dokument s daty z tabulky.
  • Pohon Google složka, kde jsou uloženy výsledné dokumenty.
  • Google Apps skript, který automatizuje úkol pro nás (Javascript based)

V mém případě byl případ použití generování smluvních textů pro zákazníky na základě jejich ceny a kvality služeb dat. Pak jsem jen exportovat a e-mailem výsledný Google Docs jako PDF.

Všechny z nich jsou uloženy na vašem účtu Google Apps v Google Drive. Všechny úpravy se děje prostřednictvím Google Apps uživatelské rozhraní, žádné externí nástroje potřebné.

Příklad zdrojových dat (popletl s obfuscate.js )

Příklad šablony dokumentu (popletl s obfuscate.js ). Můžete vidět zdrojové štítky, nevyplněné.

Příklad výsledného dokumentu - štítky vyplněné a již tučně (popletl s obfuscate.js )

2. Krátký úvod do Google Apps Script

Skriptů Google Apps lze vyvolat dvěma způsoby

Protože jsme s ním právě nepracujete tabulce musíme použít dřívější přístup.

Google Apps Script je JavaScript (ECMAScript verze nespecifikované? Má to běžet motor V8?) cloud skriptovací jazyk, který poskytuje snadný způsob, jak automatizovat úlohy napříč produkty Google a služeb třetích stran. Google Apps Script má rozsáhlou dokumentaci k rozhraní API s příklady a cvičení , ale jsou stále mnohem podléhají změnám jako téměř vše, co je označeno jako experimentální a již existuje mnoho zastaralých metod. Google Apps Skripty mohou také přístup k Google Maps, kontakty, e-maily, lokalit, domény Google Apps, nastavení a hlavně mají automatizační řešení téměř vše, co můžete dělat v Google cloudu.

Tento skript je spuštěn na straně serveru a máte non-fantazie lokalizovaný prohlížeč založený UI úpravu a ladění skriptu.

Filosofie a UI Design ťapky cítit jako krok zpět 90. let, na Visual Basic skriptovací prostředí. Možná, že Google Apps vývojáři to chtěl ... tak, že Visual Basic vývojářům cítit doma. Nicméně, pocházející z webového vývoje Javascript a obecné programování pozadí najdete nedostatek Firebug / Web Inspector jako konzole znepokojující. Nemá pocit, jako každý jiný vývoj JavaScriptu, ačkoli jistě syntaxe je stejná.

Takže moje menší stěžuje zahrnují, ale nejsou omezeny na

  • Přihlášení z aplikace je možné, ale logu je velmi nečitelný UI
  • Program nemá konkrétní vstupní bod, musíte zvolit funkci pomocí výběru widgetu.To dělá skript cítit jako hračka.
  • Debugger (a nedostatek konzole) Nezdá se, že vám umožní upravovat a dynamicky hrabat objekty v run-time (volání funkce, atd.)
  • Debugger je trochu pomalý (round-trip na serverech Google, bit), i když stále do značné míry použitelné
  • Nedostatek low-end nástrojů interakce s uživatelem v samostatném skriptování (viz níže)
  • API dokumenty a realita se ne vždy odpovídají (jako všechno, co je stále experimentální)

Debugger v akci

Mohlo by to být lepší, ale nakonec se mi podařilo se udělat to, co jsem hledal, a já jsem stále ještě platit penny pro Google Apps, takže jsem šťastný. Také Nechci se vrátit do aplikace Microsoft Office, pokud musím napsat dobře formátovaných tiskových dokumentů ... Google Docs je hračka, co přijde na těžkou a graficky citlivý dokument authoring jako nabídky .... Nebo prezentace Keynote ... kde je král.

3. Generátor skriptu

Na začátku skriptu, který má konstanty, které určují, kdy údaje k provozu. Dalo by se vytvořit uživatelské rozhraní dělat skript plné webové aplikace, ale to je příliš těžkopádný přístup na tak malý úkol. UI stavitel vypadal hezky, ale rozhodně zbytečná. Ačkoli existuje skript Google Apps API metody pro provádění jednoduchých řádek () otázku v prohlížeči, z nějakého důvodu, že nebyly doloženy v samostatném skriptování ... takže to nejrychlejší přístup k zadávání dat do skriptu byla jednoduše upravit skript sám před každým běhu. Jsem tááák začal chybět příkazový řádek ... poprvé v mém životě.

Takže, na začátku skriptu definovat zdroj dat

  • Tabulkový id (můžete si to vyzvednout z URL při úpravách dokumentu)
  • Šablona dokumentu id (můžete si to vyzvednout z URL při úpravách dokumentu)
  • Zákaznické číslo, což je číslo řádku tabulky, pro aktuální spuštění skriptu
  • Řidič Google složky id, kde bude výsledný dokument bude umístěna pro sdílení.Opět si můžete vybrat id z URL při otevření složky.

Pak skript jednoduše nahradí slova s ​​daty. Klíčové slovo má být nahrazen v dokumentu předlohy jsou označeny jako popisky sloupců (první řádek) v tabulce dat. Jsem si jistý, že by bylo účinnější způsoby, jak to udělat, ale já jsem nechtěl trávit čas jít na kolena GS zjistit své nuance.

A pak skript ... neváhejte a upravit podle svých potřeb (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 data
var CUSTOMER_SPREADSHEET = "yyy";

// In which Google Drive we toss the target documents
var 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);

    return DocumentApp.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);
  }

}

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