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.
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
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.
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
intendo dire che il foglio google dovrebbe mantenere sempre il suo ID (quello excel, essendo sovrascritto, chiaramente no). grazie ancora
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.
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