GSheets 将一个 sheet 中的一行复制到另一个 sheet,其中包含同一行

GSheets copying a row in one sheet to another sheet, which contains the same row

我有两个 sheet。一个是“Master”sheets,它包含“A”列中所有用户的列表。另一个 sheet 是“测试”sheet,它只包含这些用户的一部分。我想要它,这样如果有人在“测试”sheet 中更新了用户的行,那么它将在“主”sheet 的“A”列中找到包含该用户名的行并复制整行。

更新:这是我的代码:

function onEdit(e) {
  const range = e.range;
  const exportSheet = range.getSheet();
  if (exportSheet.getName() === "Generals" || "Captains" || "Lieutenants" || "Moderators") {
    const sourceRow = exportSheet.getRange(range.getRow(),1,1,exportSheet.getLastColumn());
    const editedData = exportSheet.getRange(range.getRow(),3,1,exportSheet.getLastColumn());
    const masterSheet = e.source.getSheetByName("Master");
    const masterValues = masterSheet.getDataRange().getValues();
    const masterRowIndex = masterValues.findIndex(masterRow => masterRow[0] === sourceRow.getValues()[0][0]) + 1;
    const masterRow = masterSheet.getRange(masterRowIndex,3,sourceRow.getNumRows(),sourceRow.getNumColumns()); 
    editedData.copyTo(masterRow);
  }
}
  • 使用 onEdit trigger, check that the edited sheet's name is test, using the corresponding Event object。如果是这种情况,请执行以下操作:
  • 检索编辑行的范围(下面示例中的变量sourceRow),使用Range.getRow()
  • 从目标 sheet(称为 MSTR)检索所有值,使用 getDataRange() and getValues()
  • 在目标 sheet 中找到 A 列与 test sheet 中的 A 列相同的行(即用户相同)。您可以为此使用 findIndex()
  • 检索与上一步找到的行索引对应的范围,使用getRange
  • 将源行复制到目标行,使用 Range.copyTo(destination)

代码示例:

// Copyright 2020 Google LLC.
// SPDX-License-Identifier: Apache-2.0

function onEdit(e) {
  const sourceSheetName = "test";
  const destSheetName = "MSTR";
  const range = e.range;
  const editedSheet = range.getSheet();
  if (editedSheet.getName() === sourceSheetName) {
    const sourceRow = editedSheet.getRange(range.getRow(),1,1,editedSheet.getLastColumn());
    const destSheet = e.source.getSheetByName(destSheetName);
    const destValues = destSheet.getDataRange().getValues();
    const destRowIndex = destValues.findIndex(destRow => destRow[0] === sourceRow.getValues()[0][0]) + 1;
    const destRow = destSheet.getRange(destRowIndex,1,sourceRow.getNumRows(),sourceRow.getNumColumns()); 
    sourceRow.copyTo(destRow);
  }
}

编辑:

如果要更改范围的起始列,则必须修改getRange(row, column, numRows, numColumns)中的第二个参数。因此,您应该检索另一个没有 A-B 列的源范围,并将该范围更改为修改后的 destRow,方法如下:

const firstCol = 3;
const sourceRowToCopy = editedSheet.getRange(range.getRow(),firstCol,1,editedSheet.getLastColumn() - firstCol + 1);
const destRow = destSheet.getRange(destRowIndex,firstCol,sourceRowToCopy.getNumRows(),sourceRowToCopy.getNumColumns());
sourceRowToCopy.copyTo(destRow);