在 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));
    }
  });
}