5

Google Tabellen bietet eine großartige interaktive Möglichkeit, bedingte Formatierung deklarativ zu definieren. Gibt es eine Möglichkeit, das gleiche deklarative Modell mit App Script zu programmieren?Regel für bedingte Formatierung hinzufügen

Ich habe ein Skript, das viele Tabellen erzeugt. Ich setze Daten und Datenvalidierungsregeln unter Verwendung der Klassen Sheet und DataValidation. Ich kann jedoch nicht dasselbe für die bedingte Formatierung tun. Ich erwartete, ein ConditionalFormattingRule Objekt oder etwas ähnliches zu finden.

Hinweis: Ich weiß, dass benutzerdefinierte Skript geschrieben werden kann, die auf eine onEdit trigger hört. Dieses Skript müsste jedoch zu der generierten Tabellen hinzugefügt werden. Auch nicht-deklarative Regeln wie diese würden nicht in der conditional formatting sidebar erscheinen.

Ich versuche nur, einen roten Hintergrund auf Zellen, die keinen Wert haben, anzuwenden.

Ist das nicht möglich?

Antwort

7

Ich glaube, dass Sie in diesem Fall einen Workaround verwenden müssen, wenn es für Ihre Situation geeignet ist.

Sie müssten ein Vorlagenblatt mit Zellen erstellen, die durch bedingte Formatierung (manuell von Ihnen erstellt) in einer Quellentabelle formatiert wurden.

Anschließend kopiert Ihr Skript dieses Vorlagenblatt in Ihre Zieltabelle und verwendet dann die Methode copyTo mit erweiterten Parametern von {formatOnly: true}, um das Format eines oder mehrerer Zellen im Vorlagenblatt zu kopieren Ihr ausgewähltes Blatt (Sie können dieses Vorlagenblatt schließlich aus der Zieltabelle löschen). (Die copyTo-Methode kopiert nur innerhalb derselben Tabelle von einem Bereich in einen anderen).

Etwas wie folgt aus:

function transferFormatting() { 
    var targetSs = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1dLv8V5fKmmxRLi5maLIOgrxVGVaqGGOD7STHbEremQs/edit#gid=0'); 
    var targetSsDisplaySheet = targetSs.getSheets()[0]; 
    var sourceSs = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/14RxLXktm0wj-lSFrl5Fas9B-smMYhknFt3-dYQbwH3o/edit#gid=933388275'); 
    var templateSheet = sourceSs.getSheetByName('Template'); 
    var targetSsFormatTemplateSheet = templateSheet.copyTo(targetSs); 

    targetSsFormatTemplateSheet.getRange("A1").copyTo(targetSsDisplaySheet.getRange("B:D"), {formatOnly:true}); 
    targetSs.deleteSheet(targetSsFormatTemplateSheet); 
} 
+0

Sah sehr vielversprechend. Der Bereich für den Bereich copyTo() fällt jedoch mit "Es tut uns leid, es ist ein Serverfehler aufgetreten. Bitte warten Sie ein wenig und versuchen Sie es erneut." – Gary

+0

Ich habe das Skript, um es auszuprobieren (und es funktioniert für mich) in eine Tabelle hier: https://docs.google.com/spreadsheets/d/1C_hlAX8KTQa33ltANKEalsy18-TDy6c4ArLwBre3yL4/edit#gid=2037749471 Probieren Sie es aus und lass es mich wissen, wenn es nicht für dich funktioniert. –

+0

Es gibt eine Methode zum Übertragen von Formatierungen jetzt range.copyFormatToRange(): https://developers.google.com/apps-script/reference/spreadsheet/range#copyFormatToRange(Integer,Integer,Integer,Integer,Integer) Ich war "Es tut uns leid, ein Serverfehler ist aufgetreten. Bitte warten Sie ein wenig und versuchen Sie es erneut." Verwenden Sie die Methode in der Antwort. –

3

Ebenfalls erhältlich ist das Advanced Sheets Services Bedingte Formatierung von Google Apps Script hinzuzufügen.

Sicher sein, Aktivieren Sie Erweiterte Google-Dienste von Ihrem Skript.Dann können Sie Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId) verwenden, um die bedingte Formatierung hinzufügen mit Google Sheets API v4 und Erweiterte Sheets Dienstleistungen

Navigieren Sie durch jedes Objekt JSON Darstellung die vollständige Anfrage Stück zusammen:

  • AddConditionalFormatRuleRequest
    • ConditionalFormatRule
      • GridRange
      • BooleanRule
        • BooleanCondition
          • Condition
        • CellFormat
// Conditionally sets the background of cells to red within range B2:J1000 
function setConditionalFormat() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet() 
    var sheet = ss.getSheets()[0] 

    var format_req = { 
    "requests": [{ 
     "addConditionalFormatRule": { 
     "rule": { 
      "ranges": [{ 
      "sheetId": sheet.getSheetId(), 
      "startRowIndex": 1, 
      "endRowIndex": sheet.getMaxRows(), 
      "startColumnIndex": 1, 
      "endColumnIndex": 10 
      }], 
      "booleanRule": { 
      "condition": { 
       "type": "BLANK" 
      }, 
      "format": { 
       "backgroundColor": { 
       "red": 1, 
       "green": 0, 
       "blue": 0, 
       "alpha": 1 
       } 
      } 
      } 
     }, 
     "index": 0, 
     } 
    }], 
    "includeSpreadsheetInResponse": false, 
    } 

    Sheets.Spreadsheets.batchUpdate(JSON.stringify(format_req), ss.getId()) 
} 
0

Der folgende Code formatiert Zeilen in Ihrer Google Tabellen Tabelle abwechselnd:

function lastLine() { 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     var sheet = ss.getSheets()[0]; 

     var range = sheet.getRange("A1:A").getValues(); 

     return range.filter(String).length; 
    } 

    function setConditionalFormat() { 
     var ss = SpreadsheetApp.getActiveSpreadsheet() 
     var sheet = ss.getSheets()[0] 

     var myRange = { 
     'sheetId': sheet.getSheetId(), 
     'startRowIndex': 1, 
     'endRowIndex': lastLine(), 
     'startColumnIndex': 0, 
     'endColumnIndex': 8 
     } 


     var format_req = { 
     'requests': [ 
      {'addConditionalFormatRule': { 
      'index': 0, 
       'rule': { 
       'ranges': [ myRange ], 
        'booleanRule': { 
        'format': {'backgroundColor': {'red': 1, 'green': 1, 'blue': 1, 'alpha': 1}}, 
         'condition': { 
         'type': 'CUSTOM_FORMULA', 
         'values': [{'userEnteredValue': '=ISEVEN(ROW())'}] 
         }, 
        }, 
       }, 

      } 
      }, 
      {'addConditionalFormatRule': { 
      'index': 0, 
       'rule': { 
       'ranges': [ myRange ], 
        'booleanRule': { 
        'format': {'backgroundColor': {'red': 222/255, 'green': 235/255, 'blue': 246/255, 'alpha': 0.7}}, 
         'condition': { 
         'type': 'CUSTOM_FORMULA', 
         'values': 
          [{'userEnteredValue': '=ISODD(ROW())'}] 
         }, 
        }, 
       }, 

      } 
      }  
     ], 
     'includeSpreadsheetInResponse': false, 
     } 

     Sheets.Spreadsheets.batchUpdate(JSON.stringify(format_req), ss.getId()) 
    } 
+0

Hintergrundfarbe in RGBA. Max 255 oder 1 Wenn Ihre Farbe 222 ist, müssen Sie um 255 getrennt werden, um die Dezimalzahl zu erhalten. –