Google 表格脚本:根据另一个单元格自动填充一个单元格,并使用脚本设置格式
Google Sheets Scripts: Autofill one cell based on another cell, and Formatting using Scripts
我想为这两种情况使用脚本,因为使用公式 and/or 当通过“拉动”附近的其他单元格输入数据时,可以更改条件格式。
- 第一个脚本
有两个 Sheet:Sheet1 和 Sheet2。
Sheet1 包含三列:
A 列 - 不同 ID(ID1、ID2、ID3...)的列表,
B 列 - 填充 0 或 1,
C 列 - 不同的名称(Name1、Name2、Name3、...)。
Sheet2 包含两列:A 列是 'ID',B 列是 'Name'.
我想要一个 脚本 可以这样自动填充 Sheet 2:
列 'ID' - 显示 Sheet1,
中值为“1”的那些 ID 的列表(列)
列 'Name' - 自动填充第一个 Sheet 中与此 ID 关联的名称。
我知道这可以通过使用 FILTER 公式和 INDEX 来完成,但正如我所说,我正在尝试找到一种不在这些工作表中使用公式的方法。
- 第二个脚本
有没有办法使用脚本对某些单元格进行条件格式设置?我希望特定列(例如,Sheet1 - B 列)始终具有灰色背景 (#EEEEEE),无论是空的还是填充的。这可以通过简单地 select 此专栏并更改其背景来完成,但我正在寻找一种使用脚本来实现此目的的方法。
此外,如果数字 0 是红色的,数字 1 是绿色的,如果它们是在某个特定列的任何位置输入的,例如 Sheet1,D 列?
谢谢!
复制内容:
Filter the source rows according to the number column, and then copy the filtered rows via setValues:
const number = 1;
const ID_COL = 1;
const NUM_COL = 2;
const NAME_COL = 3;
function autofill() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
const sourceValues = sourceSheet.getRange(2,1,sourceSheet.getLastRow()-1,sourceSheet.getLastColumn())
.getValues();
const targetValues = sourceValues.filter(row => row[NUM_COL-1] == number)
.map(row => [row[ID_COL-1], row[NAME_COL-1]]);
targetValues.unshift(["ID", "Name"]);
const targetSheet = ss.getSheetByName("Sheet2");
targetSheet.clear();
targetSheet.getRange(1, 1, targetValues.length, targetValues[0].length).setValues(targetValues);
}
如果您希望每次编辑 sheet 时都更新数据,您可以将函数重命名为 onEdit
(请参阅 onEdit)。
更改背景颜色:
通过Range.setBackground设置范围的背景颜色,如下图:
function setColumnBackground() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
sourceSheet.getRange("B:B").setBackground("#EEEEEE");
}
条件格式:
使用ConditionalFormatRule管理条件格式规则,如下所示:
function addFormattingRules() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
const range = sourceSheet.getRange("B:B");
const rule1 = SpreadsheetApp.newConditionalFormatRule()
.whenNumberEqualTo(0)
.setBackground("red")
.setRanges([range])
.build();
const rule2 = SpreadsheetApp.newConditionalFormatRule()
.whenNumberEqualTo(1)
.setBackground("green")
.setRanges([range])
.build();
const rules = sourceSheet.getConditionalFormatRules();
rules.push(rule1, rule2);
sourceSheet.setConditionalFormatRules(rules);
}
我想为这两种情况使用脚本,因为使用公式 and/or 当通过“拉动”附近的其他单元格输入数据时,可以更改条件格式。
- 第一个脚本
有两个 Sheet:Sheet1 和 Sheet2。
Sheet1 包含三列:
A 列 - 不同 ID(ID1、ID2、ID3...)的列表,
B 列 - 填充 0 或 1,
C 列 - 不同的名称(Name1、Name2、Name3、...)。
Sheet2 包含两列:A 列是 'ID',B 列是 'Name'.
我想要一个 脚本 可以这样自动填充 Sheet 2:
列 'ID' - 显示 Sheet1,
中值为“1”的那些 ID 的列表(列)列 'Name' - 自动填充第一个 Sheet 中与此 ID 关联的名称。
我知道这可以通过使用 FILTER 公式和 INDEX 来完成,但正如我所说,我正在尝试找到一种不在这些工作表中使用公式的方法。
- 第二个脚本
有没有办法使用脚本对某些单元格进行条件格式设置?我希望特定列(例如,Sheet1 - B 列)始终具有灰色背景 (#EEEEEE),无论是空的还是填充的。这可以通过简单地 select 此专栏并更改其背景来完成,但我正在寻找一种使用脚本来实现此目的的方法。
此外,如果数字 0 是红色的,数字 1 是绿色的,如果它们是在某个特定列的任何位置输入的,例如 Sheet1,D 列?
谢谢!
复制内容:
Filter the source rows according to the number column, and then copy the filtered rows via setValues:
const number = 1;
const ID_COL = 1;
const NUM_COL = 2;
const NAME_COL = 3;
function autofill() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
const sourceValues = sourceSheet.getRange(2,1,sourceSheet.getLastRow()-1,sourceSheet.getLastColumn())
.getValues();
const targetValues = sourceValues.filter(row => row[NUM_COL-1] == number)
.map(row => [row[ID_COL-1], row[NAME_COL-1]]);
targetValues.unshift(["ID", "Name"]);
const targetSheet = ss.getSheetByName("Sheet2");
targetSheet.clear();
targetSheet.getRange(1, 1, targetValues.length, targetValues[0].length).setValues(targetValues);
}
如果您希望每次编辑 sheet 时都更新数据,您可以将函数重命名为 onEdit
(请参阅 onEdit)。
更改背景颜色:
通过Range.setBackground设置范围的背景颜色,如下图:
function setColumnBackground() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
sourceSheet.getRange("B:B").setBackground("#EEEEEE");
}
条件格式:
使用ConditionalFormatRule管理条件格式规则,如下所示:
function addFormattingRules() {
const ss = SpreadsheetApp.getActive();
const sourceSheet = ss.getSheetByName("Sheet1");
const range = sourceSheet.getRange("B:B");
const rule1 = SpreadsheetApp.newConditionalFormatRule()
.whenNumberEqualTo(0)
.setBackground("red")
.setRanges([range])
.build();
const rule2 = SpreadsheetApp.newConditionalFormatRule()
.whenNumberEqualTo(1)
.setBackground("green")
.setRanges([range])
.build();
const rules = sourceSheet.getConditionalFormatRules();
rules.push(rule1, rule2);
sourceSheet.setConditionalFormatRules(rules);
}