{"id":31671,"date":"2024-04-15T13:00:40","date_gmt":"2024-04-15T11:00:40","guid":{"rendered":"https:\/\/help.qualiware.it\/qw-help\/?p=31671"},"modified":"2024-05-29T14:57:19","modified_gmt":"2024-05-29T12:57:19","slug":"integrazione-con-google-drive","status":"publish","type":"post","link":"https:\/\/help.qualiware.it\/qw-help\/integrazione-con-google-drive\/","title":{"rendered":"Integrazione con Google Drive"},"content":{"rendered":"<p>Nelle ultime versioni di QualiWare, a partire dalla 2023.00.17, sono disponibili una serie di funzionalit\u00e0 per l&#8217;interfacciamento con Google Drive. Questo interfacciamento permette di importare una serie di documenti da Google Drive (disco o cartella condivisa) a QualiWare, e viceversa.<\/p>\n<h2 id=\"importazione\">Importazione da Google Drive a QualiWare<\/h2>\n<p>Su QualiWare \u00e8 disponibile un apposito form indipendente che permette di importare documenti da un servizio in cloud (tra cui Google Drive). Si rimanda all&#8217;<a href=\"https:\/\/help.qualiware.it\/qw-help\/qw07-importazione-documenti\/\">apposita pagina<\/a> della guida per approfondirne il funzionamento.<\/p>\n<p>\u00c8 bene specificare, comunque, che \u00e8 possibile utilizzare le funzioni elencate nell&#8217;<a href=\"https:\/\/help.qualiware.it\/qw-help\/integrazione-con-google-drive#funzioni\">apposito paragrafo<\/a> di questa pagina per modificare ulteriormente il form ed aggiungerci determinate funzionalit\u00e0.<\/p>\n<h2 id=\"esportazione\">Esportazione da QualiWare a Google Drive<\/h2>\n<p>Per esportare un gruppo di documenti da QualiWare a Google Drive \u00e8 necessario, da parte dell&#8217;amministratore del Drive:<\/p>\n<ol>\n<li>creare un account di servizio, e fornire le credenziali all&#8217;amministratore di QualiWare<\/li>\n<li>condividere, con l&#8217;account di servizio, l&#8217;intero Drive, oppure le cartelle di destinazione dei documenti da esportare<\/li>\n<\/ol>\n<p>Entrambi i passaggi saranno spiegati nel dettaglio nei seguenti paragrafi.<\/p>\n<h3>Creazione dell&#8217;account di servizio<\/h3>\n<p>L&#8217;account di servizio si pu\u00f2 creare e configurare all&#8217;interno della <strong>Google Cloud Platform (CGP)<\/strong>. Per farlo, bisogna accedere alla <a href=\"https:\/\/console.cloud.google.com\/\" target=\"_blank\" rel=\"noopener\">console<\/a> e, da qui, procede alla sezione &#8220;IAM&#8221;. Per aggiungerne uno, bisogna, come indicato nell&#8217;immagine, accedere alla sezione &#8220;Service accounts&#8221; e poi cliccare su &#8220;Create Service account&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccount.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36962 aligncenter\" src=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccount.png\" alt=\"\" width=\"1017\" height=\"598\" srcset=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccount.png 1620w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccount-768x452.png 768w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccount-1536x904.png 1536w\" sizes=\"(max-width: 1017px) 100vw, 1017px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>I dati essenziali da specificare per l&#8217;account di servizio sono un nome ed un ID.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountConfig.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36964 aligncenter\" src=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountConfig.png\" alt=\"\" width=\"473\" height=\"442\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Dopo avere creato l&#8217;account, \u00e8 necessario creare una chiave di accesso per permetterne l&#8217;utilizzo tramite API. Si pu\u00f2 fare premere sull&#8217;icona nella colonna &#8220;Actions&#8221; e poi su scegliere &#8220;Manage keys&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountKeys.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-36967\" src=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountKeys.png\" alt=\"\" width=\"1637\" height=\"326\" srcset=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountKeys.png 1637w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountKeys-768x153.png 768w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountKeys-1536x306.png 1536w\" sizes=\"(max-width: 1637px) 100vw, 1637px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Dalla schermata delle chiavi, sar\u00e0 poi sufficiente cliccare su &#8220;Add Key&#8221; e poi su &#8220;Create new key&#8221;. Si aprir\u00e0 una schermata che consentir\u00e0 di scegliere il modo in cui generare la chiave. La modalit\u00e0 pi\u00f9 semplice \u00e8 quella di utilizzare il formato JSON, naturalmente con le dovute precauzioni. Il contenuto del JSON generato sar\u00e0 ci\u00f2 che bisogner\u00e0 fornire all&#8217;amministratore di QualiWare per poter impostare i servizi di esportazione. In particolare, il JSON \u00e8 ci\u00f2 che dovr\u00e0 essere passato alla funzione <code>GDriveGetService<\/code> per effettuare l&#8217;autenticazione tra QualiWare e il Drive (per i dettagli, si veda il <a href=\"https:\/\/help.qualiware.it\/qw-help\/integrazione-con-google-drive#funzioni\">paragrafo apposito<\/a>).<\/p>\n<p>L&#8217;ultimo passaggio da effettuare, per completare la configurazione dell&#8217;utente di servizio, \u00e8 abilitare l&#8217;utilizzo delle API di Google Drive da parte dell&#8217;account in questione. Per farlo, andare nella sezione &#8220;APIs and services&#8221; della console, scegliere &#8220;Enabled APIs and services&#8221;, poi &#8220;Enable APIs and services&#8221;. Fatto ci\u00f2, basta proseguire scegliendo di attivare quelle relative a Google Drive.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36970 aligncenter\" src=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs.png\" alt=\"\" width=\"1183\" height=\"590\" srcset=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs.png 1906w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs-768x383.png 768w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs-1536x766.png 1536w, https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/GoogleDriveServiceAccountEnablingAPIs-256x128.png 256w\" sizes=\"(max-width: 1183px) 100vw, 1183px\" \/><\/a><\/p>\n<h2 id=\"funzioni\">Funzioni<\/h2>\n<p>Di seguito l&#8217;elenco delle funzioni che permettono la gestione dei file su Google Drive.&nbsp;<\/p>\n<ul>\n<li><code>QWGoogle.DriveGetService(&lt;Json&gt;)<\/code>: restituisce l&#8217;oggetto servizio da passare nelle altre funzioni come parametro <code>service<\/code>. Nel parametro <code>Json<\/code> viene passato il contenuto del file JSON scaricato in fase di creazione della chiave dell&#8217;account di servizio.<\/li>\n<li><code>QWGoogle.GDriveGetFolderIDByName(&lt;service&gt;,&lt;folderName&gt;,&lt;parentFolderId&gt;)<\/code>: restituisce l&#8217;ID di una cartella a partire dal nome. Il parametro <code>parentFolderId<\/code> contiene l&#8217;Id dell&#8217;eventuale cartella all&#8217;interno della quale \u00e8 contenuta la cartella di cui \u00e8 stato specificato il nome. Questo parametro va lasciato <code>Nothing<\/code> nel caso si desideri cercare la cartella in tutto lo spazio di archiviazione condiviso. Se la cartella non esiste, la funzione ritorna <code>Nothing<\/code>.<br \/>\n<strong>ATTENZIONE<\/strong>: se non viene specificato il parametro <code>parentFolderId<\/code>, la funzione cerca in tutto lo spazio di archiviazione condiviso. Si tenga quindi in considerazione che:<\/p>\n<ul>\n<li>\u00e8 di fondamentale importanza che i nomi delle cartelle di primo livello siano univoci nello spazio di archiviazione stesso<\/li>\n<li>la funzione pu\u00f2 essere estremamente lenta (nell&#8217;ordine dei minuti) a ricavare l&#8217;ID della cartella, nel caso l&#8217;account Google utilizzato abbia un Drive corposo e\/o dei Drive condivisi. Pu\u00f2 quindi essere necessario specificare un <code>parentFolderID<\/code> per ottenere il risultato in una frazione di secondo,&nbsp;<\/li>\n<\/ul>\n<\/li>\n<li><code>QWGoogle.GDriveGetFolderNameByID(&lt;service&gt;,&lt;folderId&gt;)<\/code>: recupera il nome della cartella a partire dall&#8217;ID passato nel parametro <code>folderId<\/code>. Se la cartella non esiste, la funzione ritorna <code>Nothing<\/code>.<\/li>\n<li><code>QWGoogle.GDriveCreateFolder(&lt;service&gt;,&lt;name&gt;,&lt;parentFolderId&gt;,&lt;errmsg&gt;)<\/code>: crea una cartella con il nome specificato nel parametro <code>name<\/code> all&#8217;interno della cartella il cui ID \u00e8 specificato nel parametro <code>parentFolderId<\/code>. Questa funzione ritorna l&#8217;ID della cartella se l&#8217;operazione \u00e8 andata a buon fine, <code>Nothing<\/code> altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore.<br \/>\nNOTA: se la cartella esiste gi\u00e0, ne viene restituito l&#8217;ID.<\/li>\n<li><code>QWGoogle.GDriveGetFiles(&lt;service&gt;,&lt;folderId&gt;,&lt;optional recurse&gt;,&lt;optional filter&gt;)<\/code>: restituisce un oggetto DBArray con informazioni relative ai file contenuti nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>. Ogni elemento dell&#8217;array corrisponde ad un file, e consiste a sua volta in un DBArray di 5 elementi. Il primo \u00e8 il nome del file con relativa estensione, il secondo l&#8217;ID, il terzo la data di ultima modifica, il quarto la dimensione in byte, e il quinto il path senza nome del file (e la cui radice \u00e8 la cartella specificata nel primo tab del form). Il parametro opzionale <code>recurse<\/code>, se <code>True<\/code>, consente di recuperare i file anche dalle sotto cartelle. Il parametro opzionale <code>filter<\/code> consente di filtrare i file in base a parte del nome. E&#8217; possibile anche usare il carattere <code>*<\/code> come wildcard. Se <code><code>&lt;folderId&gt;<\/code><\/code> \u00e8 Nothing, vengono restituiti i file contenuti nella root.<\/li>\n<li><code>QWGoogle.GDriveGetFolders(&lt;service&gt;,&lt;folderId&gt;)<\/code>: restituisce un oggetto DBArray con informazioni relative alle sottocartelle contenute nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>. Gli elementi dell&#8217;array restituito sono a loro volta oggetti DBArray di due elementi. Il primo \u00e8 il nome della sottocartella, il secondo il suo ID. Se <code><code>&lt;folderId&gt;<\/code><\/code> \u00e8 Nothing, vengono restituite le cartelle dipendenti dalla root.<code><\/code><\/li>\n<li><code>QWGoogle.GDriveDeleteFileOrFolder(&lt;service&gt;,&lt;name&gt;,&lt;folderId&gt;,&lt;errmsg&gt;)<\/code><strong>*<\/strong>: cancella il file o la sottocartella il cui nome \u00e8 contenuto nel parametro <code>name<\/code> e che si trova nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>. Questa funzione ritorna <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine, <code>False<\/code> altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore. N.B. \u00e8 possibile cancellare solo file caricati tramite script. Se <code><code>&lt;folderId&gt;<\/code><\/code> \u00e8 Nothing, vengono cancellati il file o la cartella contenuti nella root.<\/li>\n<li><code>QWGoogle.GDriveDeleteFileOrFolderByID(&lt;service&gt;,&lt;ID&gt;,&lt;errmsg&gt;)<\/code><strong>*<\/strong>: cancella il file o la sottocartella il cui ID \u00e8 contenuto nel parametro <code>ID<\/code>. Questa funzione ritorna <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine, <code>False<\/code> altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore. N.B. \u00e8 possibile cancellare solo file caricati tramite script.<\/li>\n<li><code>QWGoogle.GDriveGetFile(&lt;service&gt;,&lt;name&gt;,&lt;folderId&gt;,&lt;errmsg&gt;)<\/code>: scarica il file il cui nome \u00e8 contenuto nel parametro <code>name<\/code> e che si trova nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>. Ritorna il percorso del file scaricato, oppure <code>Nothing<\/code> se l&#8217;operazione non \u00e8 andata a buon fine e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore. Se <code><code>&lt;folderId&gt;<\/code><\/code> \u00e8 Nothing, viene restituito il file contenuto nella root.<\/li>\n<li><code>QWGoogle.GDriveGetFileByID(&lt;service&gt;,&lt;ID&gt;,&lt;errmsg&gt;)<\/code>: scarica il file il cui ID \u00e8 contenuto nel parametro <code>ID<\/code>. Ritorna il percorso del file scaricato, oppure <code>Nothing<\/code> se l&#8217;operazione non \u00e8 andata a buon fine e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore.<\/li>\n<li><code>QWGoogle.GDriveUploadFile(&lt;service&gt;,&lt;path&gt;,&lt;name&gt;,&lt;folderId&gt;,&lt;errmsg&gt;)<\/code>: carica il file dal percorso specificato nel parametro <code>path<\/code> attribuendogli il nome contenuto nel parametro <code>name<\/code> e mettendolo nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>. Questa funzione ritorna <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine, <code>False<\/code>altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore. Da notare che la data di ultima modifica del file viene assegnata su Google Drive uguale a quella del file caricato, il che consente di verificare eventuali aggiornamenti intervenuti in locale o su GDrive. Si noti che questa funzione <strong>non<\/strong> aggiunge automaticamente l&#8217;estensione al nome del file.<\/li>\n<li><code>QWGoogle.GDriveRenameFileOrFolder(&lt;service&gt;,&lt;oldname&gt;,&lt;newname&gt;,&lt;folderId&gt;,&lt;errmsg&gt;)<\/code>: rinomina il file o la sottocartella il cui nome \u00e8 contenuto nel parametro <code>oldname<\/code> e che si trova nella cartella il cui ID \u00e8 specificato nel parametro <code>folderID<\/code>, assegnandogli il nome specificato nel parametro <code>&lt;newname&gt;<\/code> . Questa funzione ritorna <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine, <code>False<\/code> altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore.&nbsp;<\/li>\n<li><code>QWGoogle.GDriveRenameFileOrFolderByID(&lt;service&gt;,&lt;ID&gt;,&lt;newname&gt;,&lt;errmsg&gt;)<\/code>: rinomina il file o la sottocartella il cui ID \u00e8 contenuto nel parametro <code>ID<\/code>, assegnandogli il nome specificato nel parametro <code>&lt;newname&gt;<\/code>. Questa funzione ritorna <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine, <code>False<\/code> altrimenti, e, in questo caso, nel parametro <code>errmsg<\/code> \u00e8 contenuta la descrizione dell&#8217;errore.&nbsp;<\/li>\n<\/ul>\n<p>* La cancellazione di un file \u00e8 possibile solo se l&#8217;utente di servizio \u00e8 <strong>proprietario<\/strong> (<strong>owner<\/strong>) del file stesso e, quindi, se l&#8217;ha creato lui. Diversamente, l&#8217;uso delle funzioni ritorna l&#8217;errore &#8220;forbidden&#8221;.<\/p>\n<h2>Esempio<\/h2>\n<p>Il codice riportato di seguito su Google Drive, in una cartella condivisa chiamata &#8220;ActiveDoc&#8221;, i file relativi ad una categoria documentale di QualiWare, mettendoli in una sottocartella il cui nome \u00e8 uguale al nome della categoria, e attribuendo ai file un nome composto dal codice, dal titolo e dalla revisione.&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"visualbasic\">' Assegnare alla variabile \"json\" il contenuto del json scaricato in fase di creazione della chiave\r\nDim json As String = \"{\r\n                \"\"type\"\": \"\"sxxxxx\"\",\r\n                \"\"project_id\"\": \"\"sxxxxx\"\",\r\n                \"\"private_key_id\"\": \"\"sxxxxx\"\",\r\n                \"\"private_key\"\": \"\"-----BEGIN PRIVATE KEY-----\r\n\r\n-----END PRIVATE KEY-----\\n\"\",\r\n                \"\"client_email\"\": \"\"sxxxxx\"\",\r\n                \"\"client_id\"\": \"\"sxxxxx\"\",\r\n                \"\"auth_uri\"\": \"\"https:\/\/accounts.google.com\/o\/oauth2\/auth\"\",\r\n                \"\"token_uri\"\": \"\"https:\/\/oauth2.googleapis.com\/token\"\",\r\n                \"\"auth_provider_x509_cert_url\"\": \"\"https:\/\/www.googleapis.com\/oauth2\/v1\/certs\"\",\r\n                \"\"client_x509_cert_url\"\": \"\"https:\/\/www.googleapis.com\/robot\/v1\/metadata\/x509\/xxxxxxxxx\"\",\r\n                \"\"universe_domain\"\": \"\"googleapis.com\"\"\r\n                }\"\r\n\r\n'  Create Drive API service.\r\nDim Service As Google.Apis.Drive.v3.DriveService=QWGoogle.GDriveGetService(json)\r\n\r\nDim tipo as string=\"DM7TEST\" ' codice della categoria da esportare\r\nDim cartella as string=\"ActiveDoc\" ' Nome della sottocartella in cui esportare i documenti\r\n\r\ndim q as new QWTable()\r\nq.database=form.GetDataBase()\r\nq.sql=\"select NOME from TIPI_DOC where TIPO=:TIPO\"\r\nq.params(\"TIPO\")=tipo\r\nq.requestlive=false\r\nq.active=true\r\n\r\ndim nome_categoria as string=q.rowset.fields(1).value\r\n\r\nq.active=false\r\n\r\nDim i as integer\r\ndim errmsg as string\r\ndim ok as boolean\r\ndim id as string=QWGoogle.GDriveGetFolderIDByName(service,cartella,nothing) ' Recupera l'ID della cartella principale in cui inserire i file\r\ndim nome_cartella_categoria as string=Sane_Filename(nome_categoria)\r\ndim id_categoria as string=QWGoogle.GDriveCreateFolder(service,nome_cartella_categoria,id,errmsg)\r\nif not id is nothing\r\n        q.sql=\"select TIPO,TIPO_CONT,NUMERO,IND_REV,TITOLO,_CODDOC from DOCUMENT where TIPO=:TIPO and PUBBLICATO=1\"\r\n        q.params(\"TIPO\")=tipo\r\n        q.requestlive=false\r\n        q.active=true\r\n        \r\n        dim files as DBArray=QWGoogle.GDriveGetFiles(service,id_categoria)\r\n\r\n        ok=true\r\n        while not q.rowset.endofset and ok\r\n                dim path as string=form.GetSession().GetDocumentPath(q.rowset.fields(\"_CODDOC\").value)\r\n                dim nomefile as string=q.rowset.fields(\"TIPO_CONT\").value+\"-\"+q.rowset.fields(\"NUMERO\").value+\" \"+Sane_FIlename(q.rowset.fields(\"TITOLO\").value)+\" rev. \"+ltrim(str(q.rowset.fields(\"IND_REV\").value))+System.IO.Path.GetExtension(path)\r\n\r\n                ' Cerca nei file attuali se \u00e8 presente\r\n                dim upload as boolean=true\r\n\r\n                for i=1 to files.size\r\n                        if files(i)(1)=nomefile\r\n                                dim dtqw as DateTime=files(i)(3)\r\n                                dim dtG as DateTime=System.IO.File.GetLastWriteTime(path)\r\n                                \r\n                                if dtQW.Year=dtG.Year and dtQW.Month=dtG.Month and dtQW.Day=dtG.Day and dtQW.Hour=dtG.Hour and dtQW.Minute=dtG.Minute and dtQW.Second=dtG.Second\r\n                                        upload=false\r\n                                End If\r\n                                files(i).add(true) ' per marcarlo come presente \r\n                                Exit for\r\n                        End If\r\n                next\r\n\r\n                if upload\r\n                        ok=QWGoogle.GDriveUploadFile(Service,path,nomefile,id_categoria,errmsg,q.rowset.fields(\"TITOLO\").value)\r\n                End If\r\n                q.rowset.next()\r\n        End while\r\n        q.active=false\r\n\r\n        if ok\r\n        ' Cancella eventuali file in pi\u00f9 presenti nella cartella di esportazione\r\n                for i=1 to files.size\r\n                        if files(i).Size=3\r\n                                QWGoogle.GDriveDeleteFileOrFolder(service,files(i)(1),id_categoria,errmsg)\r\n                        End If\r\n                next     \r\n        End If   \r\nEnd If<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nelle ultime versioni di QualiWare, a partire dalla 2023.00.17, sono disponibili una serie di funzionalit\u00e0 per l&#8217;interfacciamento con Google Drive. Questo interfacciamento permette di importare una serie di documenti da Google Drive (disco o cartella condivisa) a QualiWare, e viceversa. Importazione da Google Drive a QualiWare Su QualiWare \u00e8 disponibile un apposito form indipendente che&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/31671"}],"collection":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/comments?post=31671"}],"version-history":[{"count":42,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/31671\/revisions"}],"predecessor-version":[{"id":37090,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/31671\/revisions\/37090"}],"wp:attachment":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/media?parent=31671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/categories?post=31671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/tags?post=31671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}