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);
}
- 这个脚本的流程如下。
- 检索 2 张。
- 检索值。
- 创建用于搜索名称的对象。
- 创建用于更改单元格背景颜色的数组。
- 更改单元格的背景颜色。
测试:
当此脚本是 运行 您的示例电子表格时,将获得以下结果。
发件人:
收件人:
注:
在这个示例中,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);
}
我是应用脚本的新手,仍在学习如何做事。这是我想要做的:我有 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);
}
- 这个脚本的流程如下。
- 检索 2 张。
- 检索值。
- 创建用于搜索名称的对象。
- 创建用于更改单元格背景颜色的数组。
- 更改单元格的背景颜色。
测试:
当此脚本是 运行 您的示例电子表格时,将获得以下结果。
发件人:
收件人:
注:
在这个示例中,
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);
}