JavaScript, HTML, CSS e... !
6 commenti

Copiare il contenuto di un file in un altro mantenendo lo stesso id

Sovrascrivere il contenuto di un file su Drive con Google Apps Script

Potrebbe sembrare un'operazione poco utile quella di mantenere lo stesso file sovrascrivendone il solo contenuto, ovvero senza eliminarlo fisicamente da Google Drive creandolo ex-novo o senza creare una copia del file di origine. Ci sono tuttavia situazioni dove, a maggior ragione nella generazione di automatismi, applicare questa logica può essere utile se non indispensabile.

Un esempio di reale applicazione potrebbe essere quello di un file collegato come sorgente dati ad uno strumento di analisi.
In quel caso il tool crea una connessione con il file in questione riferendosi ad esso in modo univoco tramite l'id del file ed altri suoi metadati. Se, per un aggiornamento della sorgente dati, il file venisse eliminato e ricreato, se pur con lo stesso nome, il collegamento tra esso ed lo strumento esterno verrebbe a mancare invalidandone l'uso.

Salvando il file su Google Drive è possibile, grazie a Google Apps Script, ovviare a questo inconveniente.
La funzione riportata nel seguente codice permette infatti, dato un file di origine ed uno di destinazione (nel caso specifico un normalissimo file Microsoft Excel, quindi non necessariamente un file di Google), di recuperare il contenuto da un file e sovrascriverlo a quello di un altro, mantenendo intatto l'id del file di destinazione così come tutti i suoi metadati:

var folder_id = '1Y1jz206q9f07owz1...'; // id della cartella su Drive dove si trovano i file da gestire
var file_start_name = 'file_sorgente.xlsx'; // esempio, con id: 1cSMfDTGJiJRrH7Oq...
var file_end_name = 'file_destinazione.xlsx'; // esempio, con id: 1VMbOZqdnQNZ7B5nYp...
var file_start_id = '';
var file_end_id = '';
var file_current = ''
var file_destination = '';

function overwriteFileContent() {
  
  var folder = DriveApp.getFolderById(folder_id);
  var files = folder.getFiles();
  while (files.hasNext()) {
    file = files.next();
    if (file.getName() == file_start_name) {
      file_start_id = file.getId();
      file_current = file;
    }
    if (file.getName() == file_end_name) {
      file_end_id = file.getId();
      file_destination = file;
    }
  }
  var bln_file_current = file_current ? true : false;
  var bln_file_destination = file_destination ? true : false;
  
  if (bln_file_current && bln_file_destination) {
    Drive.Files.update({ title: file_destination.getName(), mimeType: file_destination.getMimeType() }, file_destination.getId(), file_current.getAs(file_current.getMimeType()).copyBlob());
  }

  Logger.log(file_start_id + ' - ' + file_end_id);
}

Il contenuto del file di destinazione, a fine operazione, sarà identico a quello utilizzato come sorgente. Nel log inoltre verrà mostrato che il file di destinazione ha mantenuto lo stesso id che aveva ad inizio processo, a conferma del fatto che non ha subito alterazioni a livello strutturale ma solo di contenuto.

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. Sunday, May 18, 2025 alle ore 19:29 Sergio

    ciao Michele e grazie per il codice. ho provato ad utilizzarlo ma non riesco a visualizzare il risultato di copia dati. grazie per il cortese riscontro

    Rispondi a questo commento
    • Sunday, May 18, 2025 alle ore 20:23 Michele PisaniAutore

      Ciao Sergio, servono più informazioni per capire dove può stare il problema. Ad esempio, se ricevi un errore, se hai utilizzato i giusti id, se l'operazione di ferma in un punto specifico, se nel log vedi qualcosa, ecc... altrimenti risulta impossibile capire la situazione.

      Rispondi a questo commento
  2. Sunday, May 18, 2025 alle ore 23:41 Sergio Giuranna

    Certo. Probabilmente ometto qualcosa perchè non si sono presentati errori. In pratica , nel tuo codice, ho solo sostituito l'ID della cartella drive dove sono i 2 file (quello di origine è un xlsx che viene sovrascritto giornalmente a seguito di estrazioni di aggiornamento dati ma con struttura sempre uguale e quello di destinazione è un foglio google in cui aprendo apps script ho copiato il codice) e sostituito i nomi dei 2 file. Devo inserire altre info? La mia esigenza è appunto quella di avere il foglio google di destinazione aggiornato dai dati che copia da quello excel che varia mantenendo sempre il suo Id.
    Spero d'esser stato chiaro.

    grazie mille

    Rispondi a questo commento
    • Sunday, May 18, 2025 alle ore 23:43 Sergio

      intendo dire che il foglio google dovrebbe mantenere sempre il suo ID (quello excel, essendo sovrascritto, chiaramente no). grazie ancora

      Rispondi a questo commento
      • Sunday, May 18, 2025 alle ore 23:58 Michele PisaniAutore

        Il codice del post prevede che sia il file di origine che quello di destinazione abbiano un id fisso. Se il file di origine, come descrivi, è sempre un file nuovo, l'id cambia di conseguenza. Per cui è normale che il codice del post non dia errori, perché sta riportando i dati dello stesso foglio.
        Per adattarlo a funzionare con ogni volta diversi è necessario modificare la parte di recupero id del file di origine. In tal caso non potendo definire un id statico, e ponendo che il file si chiami sempre nello stesso modo, un'idea può essere quella di cercare sempre l'ultimo file con lo stesso nome e prenderne l'id.

  3. Monday, May 19, 2025 alle ore 00:46 Sergio

    si, il file di origine non cambia nome ma viene sovrascritto. In tal caso quale sarebbe il codice da utilizzare. Ti sarei molto grato se potessi riportarlo con questa variazione. Grazie in anticipo

    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