添加条件格式规则
Add conditional formatting rule
Google Sheets 有一种很好的交互方式来声明性地定义条件格式。有没有一种方法可以使用 App Script 对相同的声明性模型进行编程?
我有一个脚本可以生成很多电子表格。我使用 Sheet and DataValidation 类 设置数据和数据验证规则。但是,我似乎无法为条件格式做同样的事情。我希望找到一个 ConditionalFormattingRule 对象或类似的对象。
注意: 我知道可以编写自定义脚本来侦听 onEdit trigger. However, that script would need to be added to each of the generated spreadsheets. Also, non-declarative rules like that would not appear in the conditional formatting sidebar。
我只是想为没有价值的单元格应用红色背景。
这不可能吗?
我相信在这种情况下,如果适合您的情况,您将不得不使用变通方法。
您必须创建一个模板 sheet,在源传播sheet 中,该模板的单元格按条件格式设置(由您手动完成)。
然后您的脚本会将此模板 sheet 复制到您的目标传播sheet,然后使用带有 {formatOnly:true} 高级参数的 copyTo 方法复制将模板 sheet 中一个或一系列单元格的格式转换为您选择的 sheet(最后,您可以从目标传播 sheet 中删除此模板 sheet)。 (copyTo 方法仅在同一范围内从一个范围复制到另一个范围sheet)。
像这样:
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);
}
还可以使用 Advanced Sheets Services 从 Google Apps 脚本添加条件格式。
请务必从您的脚本中启用高级Google 服务。然后,您可以使用 Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)
添加条件格式,使用 Google Sheets API v4 和 Advanced Sheets Services
浏览每个 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())
}
以下代码将格式化您的 Google 工作表 table 中的交替行:
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())
}
使用最新的 Sheets api,您可以通过编程方式添加条件格式规则。
要添加一个规则,将 sheet 中所有空单元格的背景设置为红色,您可以这样做:
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);
您可以 运行 在您创建的每个新点差上使用此代码sheet。
Google Sheets 有一种很好的交互方式来声明性地定义条件格式。有没有一种方法可以使用 App Script 对相同的声明性模型进行编程?
我有一个脚本可以生成很多电子表格。我使用 Sheet and DataValidation 类 设置数据和数据验证规则。但是,我似乎无法为条件格式做同样的事情。我希望找到一个 ConditionalFormattingRule 对象或类似的对象。
注意: 我知道可以编写自定义脚本来侦听 onEdit trigger. However, that script would need to be added to each of the generated spreadsheets. Also, non-declarative rules like that would not appear in the conditional formatting sidebar。
我只是想为没有价值的单元格应用红色背景。
这不可能吗?
我相信在这种情况下,如果适合您的情况,您将不得不使用变通方法。
您必须创建一个模板 sheet,在源传播sheet 中,该模板的单元格按条件格式设置(由您手动完成)。
然后您的脚本会将此模板 sheet 复制到您的目标传播sheet,然后使用带有 {formatOnly:true} 高级参数的 copyTo 方法复制将模板 sheet 中一个或一系列单元格的格式转换为您选择的 sheet(最后,您可以从目标传播 sheet 中删除此模板 sheet)。 (copyTo 方法仅在同一范围内从一个范围复制到另一个范围sheet)。
像这样:
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);
}
还可以使用 Advanced Sheets Services 从 Google Apps 脚本添加条件格式。
请务必从您的脚本中启用高级Google 服务。然后,您可以使用 Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)
添加条件格式,使用 Google Sheets API v4 和 Advanced Sheets Services
浏览每个 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())
}
以下代码将格式化您的 Google 工作表 table 中的交替行:
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())
}
使用最新的 Sheets api,您可以通过编程方式添加条件格式规则。
要添加一个规则,将 sheet 中所有空单元格的背景设置为红色,您可以这样做:
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);
您可以 运行 在您创建的每个新点差上使用此代码sheet。