Google表格具有很好的交互式方式来声明性地定义条件格式。有没有办法使用App Script编写相同的声明模型?
我有一个生成许多电子表格的脚本。我使用Sheet和DataValidation类设置了数据和数据验证规则。但是,对于条件格式化,我似乎无法做同样的事情。我希望找到一个 ConditionalFormattingRule 对象或类似的东西。
注意:我知道可以编写自定义脚本来侦听onEdit trigger。但是,该脚本需要添加到生成的电子表格的每个中。此外,这样的非声明性规则不会出现在conditional formatting sidebar。
中我只是尝试将红色背景应用于没有价值的单元格。
这是不可能的吗?
答案 0 :(得分:7)
我认为,如果适合您的情况,您将不得不在这种情况下使用解决方法。
您必须在源电子表格中创建一个模板工作表,该模板工作表具有通过条件格式(由您手动完成)格式化的单元格。
然后,您的脚本会将此模板表复制到目标电子表格中,然后使用copyTo方法和{formatOnly:true}的高级参数来复制模板中一个或一系列单元格的格式将表格覆盖到您选择的工作表(最后,您可以从目标电子表格中删除此模板表格)。 (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);
}
答案 1 :(得分:3)
还可以使用Advanced Sheets Services从Google Apps脚本添加条件格式。
请务必从脚本中启用高级Google服务。然后,您可以使用Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)
使用Google Sheets API v4和高级表单服务
浏览每个JSON表示对象以拼凑完整的请求:
// 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())
}
答案 2 :(得分:1)
使用最新的Sheets api,您可以以编程方式添加条件格式规则。
要添加规则,将工作表中所有空白单元格的背景设置为红色,您可以执行以下操作:
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MySheet');
var numRows = sheet.getLastRow();
var numCols = sheet.getLastColumn();
var range = sheet.getRange(1,1, numRows, numCols);
var rule = SpreadsheetApp.newConditionalFormatRule()
.whenCellEmpty()
.setBackground("red")
.setRanges([range])
.build();
var rules = sheet.getConditionalFormatRules();
rules.push(rule);
sheet.setConditionalFormatRules(rules);
您可以在创建的每个新电子表格上运行此代码。
答案 3 :(得分:0)
以下代码将格式化Google表格表格中的交替行:
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())
}