5

Google Sheets具有很好的交互方式來聲明性地定義條件格式。有沒有辦法使用App Script來編寫同一個聲明模型?添加條件格式規則

我有一個腳本可以生成很多電子表格。我使用SheetDataValidation類來設置數據和數據驗證規則。但是,我似乎無法爲條件格式做同樣的事情。我期望找到一個ConditionalFormattingRule對象或類似的東西。

注:我知道可以編寫自定義腳本來偵聽onEdit trigger。但是,該腳本需要被添加到的每個生成的電子表格中。此外,像這樣的非聲明性規則不會出現在conditional formatting sidebar中。

我只是試圖將紅色背景應用於沒有價值的單元格。

這難道不可能嗎?

回答

7

我相信你將不得不在這種情況下使用解決方法,如果適合你的情況。

您將不得不創建一個模板工作表,它在源電子表格中具有通過條件格式(由您手動完成)格式化的單元格。

然後,您的腳本會將此模板表複製到您的目標電子表格,然後使用具有{formatOnly:true}的高級參數的copyTo方法將模板表單中的一個或一系列單元格的格式複製到您選擇的工作表(最後,您可以從目標電子表格中刪除此模板工作表)。 (copyTo方法僅在同一電子表格中從一個範圍複製到另一個範圍)。

事情是這樣的:

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

看起來非常有前途的。但是,範圍copyTo()的範圍始終會失敗,並顯示「很抱歉,發生服務器錯誤,請稍等一會,然後重試。」 – Gary

+0

我已經把這個腳本嘗試一下(它對我有效),並將其放入電子表格中:https://docs.google.com/spreadsheets/d/1C_hlAX8KTQa33ltANKEalsy18-TDy6c4ArLwBre3yL4/edit#gid=2037749471試試看讓我知道如果它不適合你。 –

+0

現在有一個方法來傳輸格式現在range.copyFormatToRange():https://developers.google.com/apps-script/reference/spreadsheet/range#copyFormatToRange(Integer,Integer,Integer,Integer,Integer) 我是先前得到「我們很抱歉,發生了服務器錯誤,請稍等一下再試一次。」在答案中使用該方法。 –

3

同時還提供了Advanced Sheets Services從谷歌Apps腳本添加條件格式。

請務必從您的腳本啓用高級Google服務。然後你可以使用Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)使用Google Sheets API v4高級牀單服務

導航通過每個JSON表示要添加的對象條件格式拼湊出完整的請求:

  • AddConditionalFormatRuleRequest
    • ConditionalFormatRule
      • GridRange
      • BooleanRule
        • BooleanCondition
          • ConditionType
        • 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

下面的代碼將格式化您的谷歌表的表交替行:

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

RGBA中的背景顏色。 最大255或1 如果您的顏色是222,則需要用255除以得到十進制數。 –