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);
我有两个 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);