Comment copier le format et les valeurs, et non des formules, lors de la création d'une sauvegarde de feuille de calcul dans Google Apps Script?

OursBeetsBSG

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 forEachfonction, 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.

Tanaike
  • Vous souhaitez copier les valeurs et le format de toutes les feuilles d'une feuille de calcul dans une nouvelle feuille de calcul.
    • Dans ce cas, vous souhaitez copier uniquement les valeurs sans les formules.
    • The source spreadsheet has a lot of formatting with merged cells, conditional formatting, etc.
    • La feuille de calcul source comprend les valeurs mises avec IMPORTRANGE.
  • Vous souhaitez y parvenir à l'aide de Google Apps Script.

Le flux de l'exemple de script pour l'objectif ci-dessus est le suivant.

Couler:

  1. Copiez toutes les feuilles de la feuille de calcul source en tant que feuilles temporelles.
  2. Au niveau des feuilles copiées, les cellules sont écrasées uniquement par les valeurs. Par cela, les formules peuvent être supprimées.
    • Si la feuille de calcul source est copiée, les valeurs récupérées avec IMPORTRANGEdeviennent #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.
  3. Copiez la feuille de calcul source.
  4. Supprimez les feuilles temporelles dans la feuille de calcul source.
  5. Supprimez les feuilles d'origine dans la feuille de calcul de destination.

Par le flux ci-dessus, seules les valeurs peuvent être copiées sans l'autorisation de IMPORTRANGE.

Exemple de script:

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));
    }
  });
}

Références:

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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

TOP Lista

CalienteEtiquetas

Archivo