问题描述
我有两张纸。一个是“主”表,其中包含“ A”列中所有用户的列表。另一个工作表是“测试”工作表,其中仅包含这些用户的一部分。我想要这样做,以便如果有人在“测试”表中更新了用户行,那么它将在“主”表的“ 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,exportSheet.getLastColumn());
const editedData = exportSheet.getRange(range.getRow(),3,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,sourceRow.getNumRows(),sourceRow.getNumColumns());
editedData.copyTo(masterRow);
}
}
解决方法
- 使用onEdit触发器,使用相应的Event object检查已编辑工作表的名称为
test
。在这种情况下,请执行以下操作: - 使用Range.getRow()检索已编辑行的范围(以下示例中的变量
sourceRow
)。 - 使用getDataRange()和getValues()从目标工作表(称为
MSTR
)中检索所有值。 - 在目标工作表中查找其A列等于
test
工作表中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,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,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,editedSheet.getLastColumn() - firstCol + 1);
const destRow = destSheet.getRange(destRowIndex,sourceRowToCopy.getNumRows(),sourceRowToCopy.getNumColumns());
sourceRowToCopy.copyTo(destRow);