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
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:
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:
È 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:
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.
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!
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?
Ciao Matteo,
purtroppo Google Cloud Print non è più supportato dal 31 dicembre 2020: https://www.google.com/intl/it_ALL/cloudprint/learn/. Non sono state rilevate ad oggi alternative valide lato codice.
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
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.
Insomma con gli script non è possibile far stampare automaticamente da Google sheet, un foglio dalla stampante
Ciao Giuseppe,
purtroppo, come indicato nei precedenti commenti, la funzionalità descritta nell'articolo non è più attiva.