Javascript, HTML, CSS e... !
0 commenti

Utilizzando il servizio Google Cloud Print

Stampare un documento presente su Drive con Google Apps Script

Con Google Apps Script è possibile inviare da codice ed in modo automatico un documento in stampa alla propria stampante grazie alla gestione delle API di Google Cloud Print, una tecnologia che consente di stampare tramite web da qualsiasi computer o dispositivo mobile anche se non sono collegati alla stampante o se si trovano su una rete diversa.

Gestendo in modo adeguato le API di Google Cloud Print, con gli script di Google, è possibile realizzare potenti automatismi come ad esempio stampare un file appena caricato sul proprio Google Drive così come un particolare documento di riepilogo a fine giornata lavorativa.

Di seguito descriverò i passaggi necessari al fine di ottenere uno script in grado di stampare un documento Google tramite una funzione che accetta 3 parametri: l'id della stampante di interesse, l'id del file da stampare ed il nome di questo file.

Per iniziare, in un nuovo progetto Apps Script includere la libreria OAuth2 (io ho utilizzato quella di GitHub arrivata, al momento della scrittura del seguente articolo, alla versione 26) da 'Risorse -> Librerie...' (per maggiori informazioni sulle Librerie può essere utile la lettura dell'articolo 'Centralizzare le funzioni in una Libreria in Google Apps Script').
Una volta inclusa la libreria è necessario entrare nella Console di sviluppo del progetto Apps Script appena creato (può essere raggiunta da 'Risorse -> Servizi avanzati di Google ...' e nella finestra che si aprirà cliccare sul link 'Console API Google') ed all'interno di essa creare, dalla sezione Credenziali, una nuova applicazione web scegliendo da 'Crea credenziali' la voce ID client OAuth.
Nella schermata successiva annotarsi l'ID client ed il Client secret (Fig. 1 punto 1) che serviranno successivamente nello script ed impostare l'URL di reindirizzamento autorizzati (Fig. 1 punto 2) con il pattern seguente, sostituendo {CHIAVE_PROGETTO} con l'id del progetto recuperabile o dall'URL dello script o copiando l'ID script da 'File -> Proprietà del progetto' e salvare.

https://script.google.com/macros/d/{CHIAVE_PROGETTO}/usercallback



id client per applicazione web

Fig. 1 - ID client per applicazione web


Su Google Cloud Print è necessario, qualora non fosse già stato fatto, configurare una stampante classica cliccando sull'apposito link che porta ad una pagina della documentazione ufficiale dove sono descritti i passaggi da seguire in base al fatto che il proprio modello di stampante sia già predisposto o meno all'utilizzo tramite il cloud. Nel mio caso non lo era ma il setup è stato sinceramente facile ed immediato, tant'è che dopo pochi secondi la mia stampante è apparsa nella lista delle stampanti di mia proprietà, Fig. 2:



lista stampanti su google cloud print

Fig. 2 - Lista stampanti su Google Cloud Print


Nota: nella lista delle Cloud Printer compare automaticamente anche una speciale stampante virtuale "Salva in Google Drive" che ti consente di salvare pagine Web e documenti come PDF in Google Drive.

Espandendo i dettagli della mia stampante è possibile individuarne l'identificativo univoco che servirà successivamente allo script per passarlo alla funzione di stampa, Fig. 3:



identificativo univoco della mia stampante su google cloud print

Fig. 3 - Identificativo univoco della mia stampante su Google Cloud Print


È la volta finalmente di passare al codice Apps Script aggiungendo le seguenti funzioni al progetto avendo cura di sostituire CLIENT_ID e CLIENT_SECRET con i relativi valori recuperati in precedenza dalla Console per gli sviluppatori.

function showURL() {
  var cpService = getCloudPrintService();
  if (!cpService.hasAccess()) {
    Logger.log(cpService.getAuthorizationUrl());
  }
}

function getCloudPrintService() {
  return OAuth2.createService('print')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId('CLIENT_ID')
    .setClientSecret('CLIENT_SECRET')
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('https://www.googleapis.com/auth/cloudprint')
    .setParam('login_hint', Session.getActiveUser().getEmail())
    .setParam('access_type', 'offline')
    .setParam('approval_prompt', 'force');
}

function authCallback(request) {
  var isAuthorized = getCloudPrintService().handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Puoi usare Google Cloud Print da Apps Script.');
  } else {
    return HtmlService.createHtmlOutput('Errore di Cloud Print: Accesso Negato');
  }
}

Una volta salvato il progetto eseguire la funzione ShowURL e autorizzare lo script ad accedere alle informazioni richieste. A fine esecuzione, aprire il Logger da 'Visualizza -> Log' e copia l'URL presente per poi incollarlo in una nuova scheda del browser ed eseguirlo per completare l'autorizzazione.

Poniamo di voler stampare il seguente documento presente sul proprio Drive, nell'immagine Fig. 4 ho evidenziato l'id del documento presente nel suo URL che servirà per essere passato alla funzione di stampa:



file google doc di esempio per la stampa

Fig. 4 - File Google Doc di esempio per la stampa


La funzione Apps Script responsabile dell'avvio della stampa è la seguente:

function printGoogleDocument(docID, printerID, docName) {

  var ticket = {
    version: "1.0",
    print: {
      color: {
        type: "STANDARD_COLOR",
        vendor_id: "Color"
      },
      duplex: {
        type: "NO_DUPLEX"
      }
    }
  };

  var payload = {
    "printerid" : printerID,
    "title"     : docName,
    "content"   : DriveApp.getFileById(docID).getBlob(),
    "contentType": "application/pdf",
    "ticket"    : JSON.stringify(ticket)
  };

  var response = UrlFetchApp.fetch('https://www.google.com/cloudprint/submit', {
    method: "POST",
    payload: payload,
    headers: {
      Authorization: 'Bearer ' + getCloudPrintService().getAccessToken()
    },
    "muteHttpExceptions": true
  });

  response = JSON.parse(response);

  if (response.success) {
    Logger.log("%s", response.message);
  } else {
    Logger.log("Error Code: %s %s", response.errorCode, response.message);
  }
}

function testStampa() {
  printGoogleDocument('1XCyrT2hjki9EKKANEf3CbClpx8nq...', '86d1f723-40f8-d9ed-fae9-3...', 'test per stampa');
}

Eseguendo la funzione chiamata testStampa, che passa i parametri relativi all'id della stampante di interesse, all'id del file da stampare ed al nome di questo file, il processo verrà avviato in Google Cloud Print, Fig. 5, e la stampa sarà fisicamente pronta in pochi secondi.



stampa in corso in google cloud print

Fig. 5 - Stampa in corso in Google Cloud Print


L'esempio mostrato utilizza i parametri in modo esplicito tuttavia è possibile recuperare in modo programmatico, oltre ovviamente alle informazioni sul file, anche quelle relative alla stampante. La funzione seguente restituisce la lista di stampanti collegate a Google Cloud Print:

function getPrinterList() {

  var response = UrlFetchApp.fetch('https://www.google.com/cloudprint/search', {
    headers: {
      Authorization: 'Bearer ' + getCloudPrintService().getAccessToken()
    },
    muteHttpExceptions: true
  }).getContentText();

  var printers = JSON.parse(response).printers;

  for (var p in printers) {
    Logger.log("%s %s %s", printers[p].id, printers[p].name, printers[p].description);
  }

Modificando il "content-Type" nella funzione in base al mimeType del file è possibile stampare pagine web, immagini, spreadsheet o qualsiasi file presente nel tuo Google Drive. I valori accettati sono i seguenti:

"url" (per le pagine web)
"dataUrl" (per la stampa di immagini con codifica in base64)
"google.drive" (per i file in Google Drive)
"google.kix" (per i Google Document)
"google.mail" (per i thread di Gmail)
"google.presentation" (per le Presentazioni Google)
"google.spreadsheet" (per i Google Spreadsheets)

Buona stampa!

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

scrivi un commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]http://www.appsscript.it[/url] se devi riferirti ad un indirizzo web