Importazione ed esportazione di progetti

Poiché i progetti Apps Script si trovano su Google Drive, gli sviluppatori possono importare ed esportare il codice sorgente di Apps Script utilizzando l'API Google Drive (da non confondere con il servizio Drive in Apps Script).

Ad esempio, uno sviluppatore può creare nuovo codice di Apps Script sulla propria macchina locale con il suo editor di codice preferito e utilizzare un sistema di controllo della versione come Git per collaborare con altri sviluppatori. Quando una versione è stata finalizzata, può caricare (importare) i file su Google Drive utilizzando l'API REST, dove possono essere utilizzati come qualsiasi altro progetto Apps Script.

Le modifiche al codice possono essere apportate alle versioni locali e sincronizzate con il progetto Apps Script utilizzando l'API Google Drive. I progetti esistenti possono essere scaricati (esportati) da Google Drive su un computer locale.

Funzionalità e limitazioni

Se vuoi utilizzare l'API Google Drive per importare o esportare progetti, tieni conto di quanto segue:

  1. I file di script lato server devono terminare con ".gs". Ti consigliamo di sviluppare localmente utilizzando i file .js, ma assicurati di rinominarli in modo che includano un'estensione .gs prima di importarli in Google Drive.
  2. I file di script lato client devono terminare con ".html". Sono inclusi file .html, .js o .css lato client. Anche in questo caso, puoi sviluppare localmente utilizzando altre estensioni, ma è importante avere l'estensione .html prima di procedere all'importazione su Google Drive.
  3. Quando importi i file del progetto in Google Drive, tutti i dati esistenti al loro interno verranno sovrascritti. Non puoi aggiungere o inserire testo parziale. È necessario aggiornare l'intero file.
  4. I file di script lato server devono contenere JavaScript valido. Se sono presenti errori nei file .js del server, la chiamata di aggiornamento dell'API Google Drive non andrà a buon fine con un errore 5xx. Puoi evitarlo eseguendo il linting del codice prima dell'importazione.
  5. Non è possibile importare file vuoti. La chiamata di aggiornamento dell'API Google Drive non andrà a buon fine con un errore 5xx se provi a caricare un file vuoto.
  6. Solo gli script autonomi possono essere importati o esportati. Non è possibile accedere agli script associati a un contenitore tramite l'API Google Drive.
  7. Solo il codice sorgente può essere importato o esportato. Anche le risorse come le proprietà o i log dei progetti non sono esposte tramite l'API Google Drive. Azioni come il controllo delle versioni, la pubblicazione o l'esecuzione dello script non sono possibili tramite l'API Google Drive.
  8. Non sei limitato a un singolo file Code.gs del server. Puoi suddividere il codice del server in più file per semplificare lo sviluppo. Tutti i file del server vengono caricati nello stesso spazio dei nomi globale, quindi utilizza le classi JavaScript quando vuoi fornire un'incapsulamento sicuro.

API Drive

L'API Google Drive consente agli sviluppatori di accedere ai file su Google Drive in modo programmatico. Questa API utilizza GET per scaricare i file e PUT/POST per caricarli. Consulta la pagina Panoramica dell'API Google Drive per la documentazione dettagliata e gli avvii rapidi.

Questa guida si concentrerà sull'elenco e sullo spostamento dei file con la risorsa File utilizzando queste chiamate:

Autorizzazione

Tutte le richieste all'API Google Drive devono essere autorizzate da un utente autenticato tramite il protocollo OAuth 2.0. Per maggiori dettagli, consulta la documentazione relativa all'autorizzazione dell'API Google Drive.

Oltre ad altri ambiti di cui un'applicazione potrebbe avere bisogno (ad esempio https://www.googleapis.com/auth/drive), tutte le applicazioni che tentano di importare o esportare progetti Google Apps Script devono richiedere l'ambito speciale:

https://www.googleapis.com/auth/drive.scripts

Elenca i progetti esistenti

Per elencare tutti i progetti di Apps Script su Drive, utilizza la risorsa File per eseguire query sui file con il tipo MIME application/vnd.google-apps.script. Per filtrare la risposta in modo che includa solo i file di tua proprietà, includi il parametro di ricerca 'me' in owners.

Ecco una richiesta e una risposta di esempio che mostrano un array di progetti Apps Script restituiti tramite una risposta JSON.

GET https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application%2Fvnd.google-apps.script'+and+'me'+in+owners
Authorization:  Bearer ya29.fakebearerstring
{
 "kind": "drive#fileList",
 "etag": "\"kjsas92/f3zGUXczKMxEB_9ZTMRFOF3d1ZU\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application/vnd.google-apps.script'+and+'me'+in+owners",
 "items": [
  {
   "kind": "drive#file",
   "id": "1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "etag": "\"kjsas92/MTM3MDk3ODY5ODQyNg\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "alternateLink": "https://script.google.com/a/google.com/d/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/edit?usp=drivesdk",
   "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_script_list.png",
   "title": "Mail merge",
   "mimeType": "application/vnd.google-apps.script",
   "description": "",
   "labels": {
    "starred": false,
    "hidden": false,
    "trashed": true,
    "restricted": false,
    "viewed": true
   },
   "createdDate": "2013-06-11T19:24:45.188Z",
   "modifiedDate": "2013-06-11T19:24:58.426Z",
   "modifiedByMeDate": "2013-06-11T19:24:58.426Z",
   "lastViewedByMeDate": "2013-06-11T19:24:58.426Z",
   "parents": [
    {
     "kind": "drive#parentReference",
     "id": "0APdyIOzo7bWDUk9PVA",
     "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/parents/0APdyIOzo7bWDUk9PVA",
     "parentLink": "https://www.googleapis.com/drive/v2/files/0APdyIOzo7bWDUk9PVA",
     "isRoot": true
    }
   ],
   "exportLinks": {
    "application/json": "https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json"
   },
   "userPermission": {
    "kind": "drive#permission",
    "etag": "\"kjsas92/259X2r5DVstv1CcIQTjt_RQPSW8\"",
    "id": "me",
    "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/permissions/me",
    "role": "owner",
    "type": "user"
   },
   "quotaBytesUsed": "0",
   "ownerNames": [
    "John Doe"
   ],
   "owners": [
    {
     "kind": "drive#user",
     "displayName": "John Doe",
     "picture": {
      "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
     },
     "isAuthenticatedUser": true,
     "permissionId": "1234566789"
    }
   ],
   "lastModifyingUserName": "John Doe",
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "John Doe",
    "picture": {
     "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
    },
    "isAuthenticatedUser": true,
    "permissionId": "1234566789"
   },
   "editable": true,
   "writersCanShare": true,
   "shared": false,
   "explicitlyTrashed": true,
   "appDataContents": false
  }
 ]
}

Se conosci l'ID file di un progetto Apps Script, puoi recuperarlo direttamente con la seguente chiamata API:

GET https://www.googleapis.com/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerstring

Esportare progetti da Drive

Una volta ricevuta una risorsa File dall'API, la proprietà exportLinks conterrà un URL da recuperare per ottenere i contenuti del progetto come dati JSON. Ecco un esempio di come potrebbe essere questo URL:

https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json

Invia una richiesta a questo URL per recuperare i contenuti del progetto stesso. Assicurati di includere un'intestazione Authorization con lo stesso token OAuth Bearer.

Ecco un esempio di richiesta e risposta:

GET https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json
Authorization:  Bearer ya29.fakebearerstring
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

L'esempio riportato sopra include il codice di una semplice app web dalla guida HTML Service. Tieni conto che viene restituito un array di Files, ciascuno con le seguenti 4 proprietà:

id Identificatore interno di un file all'interno di un progetto, necessario per fare riferimento a questo file durante gli aggiornamenti.
name Il nome del file senza estensioni, visualizzato nell'editor di script.
type I due tipi di file sono server_js e html.
source Il codice sorgente codificato contenuto nel file.

Importare i progetti su Drive

Per aggiornare un progetto esistente, effettua una chiamata PUT HTTP all'API FILEupdate con il fileId appropriato. L'esempio seguente mostra una transazione di esempio per la parte di caricamento di contenuti multimediali. Utilizzando una delle librerie client, la tua applicazione può includere facilmente i metadati e i contenuti multimediali nella stessa chiamata di caricamento. Tieni presente che l'intestazioneContent-Type specifica il tipo di contenuti caricati in questo caso.

PUT https://www.googleapis.com/upload/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    New message!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

Creare nuovi file all'interno di un progetto

Per creare un nuovo file all'interno di un progetto, invia una richiesta PUT per un file senza la proprietà id. Se includi un file con un identificatore sconosciuto, il sistema genererà un messaggio di errore.

Eliminare file all'interno di un progetto

Per eliminare un file da un progetto, invia una richiesta PUT che non includa quel file (ma includa tutti gli altri file del progetto). Qualsiasi file che non viene inviato di nuovo durante la procedura di importazione verrà eliminato dal server.

Rinominare i file all'interno di un progetto

Per rinominare un file all'interno di un progetto, invia una richiesta PUT con il id esistente, ma con un nuovo name. Tieni presente che il server ignora qualsiasi tentativo di passare a type.

Crea nuovo progetto

Per creare un nuovo progetto, invia una richiesta POST all'API file insert. Come per la chiamata update, puoi utilizzare una libreria client per includere metadati come il nome e la descrizione del progetto.

Ecco un esempio di transazione di caricamento dei contenuti multimediali. Verrà creato un progetto chiamato "Senza titolo" su Drive. Il parametro convert nell'URL è obbligatorio. Come per la chiamata update, l'intestazione Content-Type è obbligatoria.

POST https://www.googleapis.com/upload/drive/v2/files?convert=true
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}