web-dev-qa-db-fra.com

Appliquer plusieurs couleurs de police au texte dans une seule cellule Google Sheets

J'essaie de formater une cellule pour qu'elle ait plusieurs couleurs de police à l'aide d'une fonction de Google Apps Script. Je ne trouve aucune documentation à ce sujet. De plus, l'utilisation de getFontColor() ne renvoie rien d'utile.

Existe-t-il un moyen de reproduire par programmation cette fonctionnalité

enter image description here

qui est disponible pour les utilisateurs via l'interface utilisateur Web de Google Sheets?

10
MGomeyy

Sheets API est un peu intimidant pour commencer à utiliser, mais permet un contrôle très fin sur vos feuilles de calcul. Vous devrez l'activer , car il s'agit d'un "service avancé". Je recommande fortement de revoir le Sample Codelab .

Avec l'API Sheets, la propriété TextFormatRun peut être manipulée cellule par cellule. Remarque:

Exécutions de texte enrichi appliquées aux sous-sections de la cellule. Les exécutions ne sont valides que sur les chaînes saisies par l'utilisateur, pas sur les formules, les bools ou les nombres. Les exécutions commencent à des index spécifiques dans le texte et se poursuivent jusqu'à la prochaine exécution. Les propriétés d'une exécution continueront à moins qu'elles ne soient explicitement modifiées dans une exécution suivante (et les propriétés de la première exécution continueront les propriétés de la cellule sauf modification explicite).

Lors de l'écriture, les nouvelles exécutions écraseront toutes les exécutions précédentes. Lors de l'écriture d'un nouveau userEnteredValue, les exécutions précédentes seront effacées.

Cet exemple l'utilise pour ajuster la valeur verte du texte, augmentant de 0 à 100% sur la longueur d'une chaîne dans la cellule active. Ajustez selon vos besoins.

function textFormatter() {
  // Get the current cell's text.
  var wb = SpreadsheetApp.getActive(), sheet = wb.getActiveSheet();
  var cell = sheet.getActiveCell(), value = cell.getValue();
  var len = value.toString().length;
  if(len == 0) return;

  // Change the color every 2 characters.
  var newCellData = Sheets.newCellData();
  newCellData.textFormatRuns = [];
  var step = 1 / len;
  for(var c = 0; c < len; c += 2) {
    var newFmt = Sheets.newTextFormatRun();
    newFmt.startIndex = c;
    newFmt.format = Sheets.newTextFormat();
    newFmt.format.foregroundColor = Sheets.newColor();
    newFmt.format.foregroundColor.green = (c + 2) * step;
    newCellData.textFormatRuns.Push(newFmt);
  }

  // Create the request object.
  var batchUpdateRQ = Sheets.newBatchUpdateSpreadsheetRequest();
  batchUpdateRQ.requests = [];
  batchUpdateRQ.requests.Push(
    {
       "updateCells": {
        "rows": [ { "values": newCellData } ],
        "fields": "textFormatRuns",
        "start": {
          "sheetId": sheet.getSheetId(),
          "rowIndex": cell.getRow() - 1,
          "columnIndex": cell.getColumn() - 1
        }
      }
    }
  );
  Sheets.Spreadsheets.batchUpdate(batchUpdateRQ, wb.getId());
}

Modifier: selon la façon dont la valeur des cellules à formater est définie, il peut également être nécessaire d'inclure la valeur de la cellule dans la même demande. Voir cet exemple sur le tracker de problème

3
tehhowch

Depuis juillet 2018, Apps-Script prend en charge la modification des couleurs de texte individuelles et d'autres styles liés aux polices. Deux méthodes sont ajoutées à SpreadsheetApp. newTextStyle() et newRichTextValue(). Le script d'application suivant modifie ces styles de police dans A1. Pour de meilleurs effets, utilisez une longue chaîne (30 caractères ou plus).

function Rainbow(){
  var rng = SpreadsheetApp.getActiveSheet().getRange("A1");
  var val = rng.getValue().toString();
  var len = val.length; // length of string in A1
  var rich = SpreadsheetApp.newRichTextValue(); //new RichText
  rich.setText(val); //Set Text value in A1 to RichText as base 
  for (var i=0;i<len;i++){ //Loop through each character
    var style = SpreadsheetApp.newTextStyle(); // Create a new text style for each character
    var red= ("0"+Math.round((1/len)*(i)*255).toString(16)).substr(-2,2); //????
    var green= ("0"+Math.round((1/len)*Math.min(i*2,len-Math.abs(i*2-len))*255).toString(16)).substr(-2,2); //????????
    var blue= ("0"+Math.round((1/len)*(len-i)*255).toString(16)).substr(-2,2);//????
    style.setForegroundColor("#"+red+green+blue); // hexcode
    style.setFontSize(Math.max(Math.abs(len/2-i),8)); //Use a lengthy string
    var buildStyle = style.build(); 
    rich.setTextStyle(i,i+1,buildStyle); // set this text style to the current character and save it to Rich text     
  }
  var format = rich.build()
  rng.setRichTextValue(format); //Set the final RichTextValue to A1
}

La documentation n'est pas encore publiée. Les méthodes sont sujettes à changement

Références:

5
TheMaster