Google Sheet 应用程序脚本:将一个 sheet 的 1 个值匹配到另一个 sheet,然后如果条件满足设置背景

Google Sheet App Script: Match 1 values from one sheet to another sheet and then if condition met set background

我是应用脚本的新手,仍在学习如何做事。这是我想要做的:我有 2 张表,第 1 张只是基于每个人语言的列中的名称 ('List'),第 2 张是时间表 ('Roster')。我想在 8 点到 5 点准时将带有人名的单元格背景更改为绿色。

非常感谢任何帮助或想法。提前谢谢你。

这是我到目前为止尝试做的事情:

function addShiftColor() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var actSheet = ss.getSheetByName('List');
  var rosSheet = ss.getSheetByName('Roster');
  var lastCol = actSheet.getLastColumn() +1;
  var lastRow = actSheet.getLastRow() +1;
  var end = rosSheet.getLastRow();
    for (var column = 1; column < lastCol; column++) {
      for (var row = 1; row < lastRow; row++) {
        var cellget = actSheet.getRange(row, column).getValue();
        var cellset = actSheet.getRange(row, column);
          for(i=1, j=5; i <= end, j <= end; i++,j++){
            var cell1 = rosSheet.getRange(i, 1).getValue();
            var cell2 = rosSheet.getRange(j, 253).getValue();
          if(cell1 === cellget && cell2 === "08 -- 17"){
          cellset.setBackground("green");
          }
      }
    }   
  }
}

第二Sheet'Roster'

第一Sheet'List'

这就是我想要达到的结果。

这是 link 文件 https://docs.google.com/spreadsheets/d/1wfSEQtqZJ3XEPla_KRBp7v56sPV5wlciHEHA7IS0MaI/edit?usp=sharing

谢谢!

在您的情况下,下面的示例脚本怎么样?

示例脚本:

function myFunction() {
  // 1. Retrieve 2 sheets.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const listSheet = ss.getSheetByName("List");
  const rosterSheet = ss.getSheetByName("Roster");

  // 2. Retrieve values.
  const listRange = listSheet.getRange(2, 1, listSheet.getLastRow() - 1, listSheet.getLastColumn());
  const [, , dates, , ...rosterValues] = rosterSheet.getDataRange().getDisplayValues();

  // 3. Create an object for searching names.
  const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM");
  const col = dates.indexOf(today);
  if (col == -1) {
    throw new Error(`Date of ${today} was not found.`);
  }
  const obj = rosterValues.reduce((o, r) => {
    if (r[0]) o[r[0]] = r[col];
    return o;
  }, {});

  // 4. Create an array for changing the background color of cells.
  const colors = listRange.getValues().map((r, i) => r.map((c, j) => obj[c] && obj[c] == "08 -- 17" ? "green" : null));

  // 5. Change the background color of cells.
  listRange.setBackgrounds(colors);
}
  • 这个脚本的流程如下。
    1. 检索 2 张。
    2. 检索值。
    3. 创建用于搜索名称的对象。
    4. 创建用于更改单元格背景颜色的数组。
    5. 更改单元格的背景颜色。

测试:

当此脚本是 运行 您的示例电子表格时,将获得以下结果。

发件人:

收件人:

注:

  • 在这个示例中,green被用作背景色。这是来自您的脚本。如果你想改变这个,请修改"green".

  • 此示例脚本适用于您的示例电子表格。因此,当 Spreadsheet 的结构发生变化时,此脚本可能无法使用。所以,请注意这一点。

参考文献:

已添加:

关于您的以下附加问题,

I have a question, If I would like to add as well different colors for 11-20 and 17-20, what should be changed in the script?

在这种情况下,下面的示例脚本怎么样?

示例脚本:

function myFunction() {
  const colorObj = { "08 -- 17": "green", "17 -- 02": "blue", "11 -- 20": "red" }; // Please modify this for your actual situation.

  // 1. Retrieve 2 sheets.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const listSheet = ss.getSheetByName("List");
  const rosterSheet = ss.getSheetByName("Roster");

  // 2. Retrieve values.
  const listRange = listSheet.getRange(2, 1, listSheet.getLastRow() - 1, listSheet.getLastColumn());
  const [, , dates, , ...rosterValues] = rosterSheet.getDataRange().getDisplayValues();

  // 3. Create an object for searching names.
  const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM");
  const col = dates.indexOf(today);
  if (col == -1) {
    throw new Error(`Date of ${today} was not found.`);
  }
  const obj = rosterValues.reduce((o, r) => {
    if (r[0]) o[r[0]] = r[col];
    return o;
  }, {});

  // 4. Create an array for changing the background color of cells.
  const keys = Object.keys(colorObj);
  const colors = listRange.getValues().map((r, i) => r.map((c, j) => obj[c] && keys.includes(obj[c]) ? colorObj[obj[c]] : null));

  // 5. Change the background color of cells.
  listRange.setBackgrounds(colors);
}