L'objectif est de créer des sauvegardes figées d'une feuille de calcul avec plusieurs feuilles. La feuille de calcul de sauvegarde doit copier les valeurs et le format, mais pas les formules.
Certaines des feuilles ont =IMPORTRANGE
, ce qui devient un problème si la feuille de calcul est copiée d'abord, puis les valeurs copiées sur la même plage, encore une fois, pour se débarrasser des formules, car la nouvelle feuille de calcul nécessite l'accès à la plage importée au milieu de la fonction (ce qui conduit à #REF en A1).
Cette question a été clairement posée à plusieurs reprises, mais aucune des réponses ne semble résoudre ce problème. J'ai examiné ces questions (et plus encore, en fait): Lien 1 , Lien 2 , Lien 3 , Lien 4 , Lien 5 et Lien 6 . J'ai essayé d'implémenter des extraits des réponses à ces questions ou des combinaisons d'entre elles en vain. Il est devenu trop difficile de suivre chaque extrait de code que j'ai testé.
J'ai essayé d'utiliser copyTo()
soit pour copier des feuilles entières dans une forEach
fonction, copier avec les options {contentsOnly:true}
et {formatOnly:true}
, mais sans succès. Soit copyTo()
veut que les plages soient dans la même feuille de calcul / feuille, soit getDataRange()
ne correspond pas à la plage de sauvegarde ...
Voici le script que j'utilise actuellement, qui crée avec succès une copie de la feuille de calcul entière avec des valeurs uniquement. Je ne me souviens pas de quelle question je l'ai tirée.
function copyEntireSpreadsheet(){
var ss,ssName,sheet,sheetName,data,destination
ss = SpreadsheetApp.openById("id").getSheets();
ssName = SpreadsheetApp.openById("id").getName();
destination = SpreadsheetApp.create(ssName + " - " + new Date().toLocaleString());
for (var i = 0; i < ss.length; i++){
sheet = ss[i];
sheetName = sheet.getSheetName();
data = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn());
destination.insertSheet(sheetName);
destination.getSheets()[i+1].getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setValues(data);
}
destination.deleteSheet(destination.getSheetByName('Sheet1'));
}
La feuille de calcul source a beaucoup de mise en forme avec des cellules fusionnées, une mise en forme conditionnelle, etc., ce qui serait idéal à copier. Je peux également coder en dur certaines feuilles dans le script, si cela fait une différence avec une méthode alternative.
En bref: je recherche une sauvegarde figée d'une feuille de calcul avec plusieurs feuilles. Les valeurs et la mise en forme doivent être copiées, pas les formules.
Je manque peut-être quelque chose dans l'une des réponses à toutes ces questions, alors je vais continuer d'essayer. En attendant, toute aide / direction serait appréciée. Merci d'avance!
RÉSOLU: Le deuxième exemple de script de @ Tanaike ci-dessous est une excellente solution de contournement pour copier des feuilles qui ont des références à d'autres feuilles de calcul et nécessitent donc d'y accéder avant d' être écrasées par des valeurs uniquement. Un grand merci à @Tanaike pour son aide considérable - très appréciée.
The source spreadsheet has a lot of formatting with merged cells, conditional formatting, etc.
IMPORTRANGE
.Le flux de l'exemple de script pour l'objectif ci-dessus est le suivant.
IMPORTRANGE
deviennent #REF
. Parce qu'il est nécessaire d'autoriser à la nouvelle feuille de calcul copiée. Pour éviter cela, les feuilles temporelles sont copiées dans la feuille de calcul source.Par le flux ci-dessus, seules les valeurs peuvent être copiées sans l'autorisation de IMPORTRANGE
.
function copyEntireSpreadsheet() {
var id = "###"; // Please set the source Spreadsheet ID.
var ss = SpreadsheetApp.openById(id);
var srcSheets = ss.getSheets();
var tempSheets = srcSheets.map(function(sheet, i) {
var sheetName = sheet.getSheetName();
var dstSheet = sheet.copyTo(ss).setName(sheetName + "_temp");
var src = dstSheet.getDataRange();
src.copyTo(src, {contentsOnly: true});
return dstSheet;
});
var destination = ss.copy(ss.getName() + " - " + new Date().toLocaleString());
tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});
var dstSheets = destination.getSheets();
dstSheets.forEach(function(sheet) {
var sheetName = sheet.getSheetName();
if (sheetName.indexOf("_temp") == -1) {
destination.deleteSheet(sheet);
} else {
sheet.setName(sheetName.slice(0, -5));
}
});
}
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras