JavaScript, HTML, CSS e... !
6 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

6 Commenti

  1. Tuesday, November 30, 2021 alle ore 17:19 matteo

    buongiorno
    ho trovato molto interessante l'articolo, in quanto io ho l'esigenza di stampare in automatico dei google docs.
    Ho creato un automatismo che da un modulo google crea in automatico un google doc. Vorrei che quando il google doc viene generato, venga anche in automatico stampato dalla mia stampante, al momento collegata via USB ma volendo posso anche metterla in rete.
    negli ultimi paragrafi, spieghi che "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", dopodichè dai l'esempio di come si può avere la lista stampanti. A me srvirebbe invece capire quale sia la stringa giusta per fare in modo che la stampa automatica non avvenga tramite il nome file, ma che la stampa parta in automatico ogni volta che creo un nuovo google doc. è possibile? mi sai dire quali sono i comandi giusti?

    Rispondi a questo commento
  2. Tuesday, September 6, 2022 alle ore 17:34 Badiali

    Buongiorno Michele,
    ho letto il tuo articolo e sto seguendo molti tuoi video per addentrarmi nel mondo script di google.
    Ti spiego brevemente la mia esigenza perchè forse saprai fornirmi indicazioni differenti rispetto al contenuto di questo articolo, poichè se ho ben capito alcuno funzionalità non sono piè attive.

    In breve vorrei creare un bottone con cui stampare una area specifica del foglio, ho provato a registrare una macro, ma non funziona. Inoltre, seguendo i passaggi dell'articolo, nel momento in cui bisogna inserire l'ID script per aggiungere la libreria OAuth2, dice che esso non esiste.

    Attendo un tuo riscontro
    A presto
    Valentina

    Rispondi a questo commento
    • Tuesday, September 6, 2022 alle ore 23:51 Michele PisaniAutore

      Ciao Valentina,
      purtroppo la funzionalità descritta nell'articolo non è più attiva. Quello che puoi provare a fare è ad esempio prendere un intervallo prestabilito dal foglio e produrre un PDF di quell'intervallo.

      Rispondi a questo commento
  3. Thursday, January 5, 2023 alle ore 20:21 Giuseppe Parrotta

    Insomma con gli script non è possibile far stampare automaticamente da Google sheet, un foglio dalla stampante

    Rispondi a questo commento
    • Thursday, January 5, 2023 alle ore 20:31 Michele PisaniAutore

      Ciao Giuseppe,
      purtroppo, come indicato nei precedenti commenti, la funzionalità descritta nell'articolo non è più attiva.

      Rispondi a questo 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]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web