Google 表格脚本:根据另一个单元格自动填充一个单元格,并使用脚本设置格式

Google Sheets Scripts: Autofill one cell based on another cell, and Formatting using Scripts

我想为这两种情况使用脚本,因为使用公式 and/or 当通过“拉动”附近的其他单元格输入数据时,可以更改条件格式。

  1. 第一个脚本

有两个 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 来完成,但正如我所说,我正在尝试找到一种不在这些工作表中使用公式的方法。

  1. 第二个脚本

有没有办法使用脚本对某些单元格进行条件格式设置?我希望特定列(例如,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);
}