在 Google 表格中编写脚本以搜索 sheet 列中的字符串并将信息从该行传输到另一个 sheet 中的行
Writing a script in Google Sheets to search a sheet for a string in a column and transfer information from that row to rows in another sheet
我正在尝试根据来自中央数据库的员工姓名将信息从一个 sheet 转移到另一个。
我会尝试用图片来解释这里的问题,我会 link 底部的 sheets。
“姓名 Sheet1”包含员工姓名列表,以及他们今天早餐、午餐、最喜欢的食物、最喜欢的汽水、最喜欢的颜色和最喜欢的动物。
Name Sheet 1
这些姓名是根据他们加入公司的日期输入到“姓名 Sheet 1”的。 “姓名 Sheet 2”包含相同的信息,但是现在根据年龄输入姓名,因此姓名的顺序不同。
Name sheet 2
列 B 和 C 每天从另一个数据库自动更新,但列 A、D-G 不会更改。 A-C 列中的所有 sheet 信息每天都会被覆盖,但是它们将始终以相同的顺序排列,因此 D-G 不会更新,因为它们不会更改,除非手动添加/删除员工。
现在我们要移动到“Name Sheet 2”,我正在尝试将所有数据从“Name Sheet 1”移动到这个新的 sheet。
我正在尝试编写一个脚本,该脚本将在“姓名 Sheet 2”中搜索员工姓名,复制“姓名 Sheet 1”中该员工的 D-G 列数据,并将该信息粘贴到“姓名 Sheet 2”
中该员工的 D-G 列中
例如;在“Name Sheet 1”中,我们看到 Bob 在第 2 行,但在“Name sheet 2”中是第 4 行。此脚本会在“Name sheet 1”中找到 Bob,复制 D2:G2,然后在“Name sheet 2”中的 A 列中搜索“Bob”,当它在A4,它会粘贴到D4。
我已经找到可以搜索 sheet 并将信息打印到另一个 sheet 的脚本,但是我还没有找到任何用于搜索第二个 sheet 的脚本和 copy/paste 具体信息。
这是此搜索功能的代码
var SPREADSHEET_NAME = "Name Sheet1";
var SEARCH_COL_IDX = 1;
var RETURN_COL_IDX = 0;
function searchStr(str) {
var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SPREADSHEET_NAME).getDataRange().getValues();
for (var i = 0; i < values.length; i++) {
var row = values[i];
if (row[SEARCH_COL_IDX] == str) {
return row[RETURN_COL_IDX];
}
}
}
姓名sheet2:https://docs.google.com/spreadsheets/d/1j6wt-ZDwnuXUf6Z3alyjUInuV2PHTdOweGf2L_JkxJ8/edit?usp=sharing
您可以使用单元格中的 VLOOKUP 语句轻松完成此操作,不一定是脚本。 VLOOKUP 公式将从当前 sheet 的 A 列获取搜索字符串(名称),然后转到 sheet 1 并找到该字符串,然后从相应的列获取值。
例如,将 VLOOKUP 公式添加到单元格 D2(Greg 最喜欢的食物)-
该公式将引用 Greg ($A2) 的搜索字符串,将在 Sheet1 中搜索该字符串 (Sheet1!$A:$G),将 return 列 D (4) 中该行的值,然后设置“is_sorted”标志(通常设置为 false):
相同的公式可用于 E、F、G 列,将 4 交换为 5、6 或 7,具体取决于从哪一列检索它。
(您当然也可以对所有列 B-G 使用相同的公式,而不仅仅是 D-G。)
单元格 G5 中的公式示例:
function copyDG() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName('Names Sheet 1');
const rg1 = sh1.getRange(2,1,sh1.getLastRow() - 1);
const vs1 = rg1.getDisplayValues();
const sh2 = ss.getSheetByName('Names Sheet 2');
const rg2 = sh2.getRange(2,1,sh2.getLastRow() - 1);
const vs2 = rg2.getDisplayValues().flat();
vs1.forEach((r,i) => {
let idx = vs2.indexOf(r[0]);
if(~idx) {
sh1.getRange(i+2,4,1,4).copyTo(sh2.getRange(idx + 2,4));
}
});
}
我正在尝试根据来自中央数据库的员工姓名将信息从一个 sheet 转移到另一个。
我会尝试用图片来解释这里的问题,我会 link 底部的 sheets。
“姓名 Sheet1”包含员工姓名列表,以及他们今天早餐、午餐、最喜欢的食物、最喜欢的汽水、最喜欢的颜色和最喜欢的动物。
Name Sheet 1
这些姓名是根据他们加入公司的日期输入到“姓名 Sheet 1”的。 “姓名 Sheet 2”包含相同的信息,但是现在根据年龄输入姓名,因此姓名的顺序不同。
Name sheet 2
列 B 和 C 每天从另一个数据库自动更新,但列 A、D-G 不会更改。 A-C 列中的所有 sheet 信息每天都会被覆盖,但是它们将始终以相同的顺序排列,因此 D-G 不会更新,因为它们不会更改,除非手动添加/删除员工。
现在我们要移动到“Name Sheet 2”,我正在尝试将所有数据从“Name Sheet 1”移动到这个新的 sheet。
我正在尝试编写一个脚本,该脚本将在“姓名 Sheet 2”中搜索员工姓名,复制“姓名 Sheet 1”中该员工的 D-G 列数据,并将该信息粘贴到“姓名 Sheet 2”
中该员工的 D-G 列中例如;在“Name Sheet 1”中,我们看到 Bob 在第 2 行,但在“Name sheet 2”中是第 4 行。此脚本会在“Name sheet 1”中找到 Bob,复制 D2:G2,然后在“Name sheet 2”中的 A 列中搜索“Bob”,当它在A4,它会粘贴到D4。
我已经找到可以搜索 sheet 并将信息打印到另一个 sheet 的脚本,但是我还没有找到任何用于搜索第二个 sheet 的脚本和 copy/paste 具体信息。 这是此搜索功能的代码
var SPREADSHEET_NAME = "Name Sheet1";
var SEARCH_COL_IDX = 1;
var RETURN_COL_IDX = 0;
function searchStr(str) {
var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SPREADSHEET_NAME).getDataRange().getValues();
for (var i = 0; i < values.length; i++) {
var row = values[i];
if (row[SEARCH_COL_IDX] == str) {
return row[RETURN_COL_IDX];
}
}
}
姓名sheet2:https://docs.google.com/spreadsheets/d/1j6wt-ZDwnuXUf6Z3alyjUInuV2PHTdOweGf2L_JkxJ8/edit?usp=sharing
您可以使用单元格中的 VLOOKUP 语句轻松完成此操作,不一定是脚本。 VLOOKUP 公式将从当前 sheet 的 A 列获取搜索字符串(名称),然后转到 sheet 1 并找到该字符串,然后从相应的列获取值。
例如,将 VLOOKUP 公式添加到单元格 D2(Greg 最喜欢的食物)-
该公式将引用 Greg ($A2) 的搜索字符串,将在 Sheet1 中搜索该字符串 (Sheet1!$A:$G),将 return 列 D (4) 中该行的值,然后设置“is_sorted”标志(通常设置为 false):
相同的公式可用于 E、F、G 列,将 4 交换为 5、6 或 7,具体取决于从哪一列检索它。
(您当然也可以对所有列 B-G 使用相同的公式,而不仅仅是 D-G。)
单元格 G5 中的公式示例:
function copyDG() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName('Names Sheet 1');
const rg1 = sh1.getRange(2,1,sh1.getLastRow() - 1);
const vs1 = rg1.getDisplayValues();
const sh2 = ss.getSheetByName('Names Sheet 2');
const rg2 = sh2.getRange(2,1,sh2.getLastRow() - 1);
const vs2 = rg2.getDisplayValues().flat();
vs1.forEach((r,i) => {
let idx = vs2.indexOf(r[0]);
if(~idx) {
sh1.getRange(i+2,4,1,4).copyTo(sh2.getRange(idx + 2,4));
}
});
}