google-apps-script - GSheets 将一个工作表中的一行复制到另一个工作表,其中包含相同的行
问题描述
我有两张床单。一个是“主”表,其中包含“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,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
test
触发器,使用相应的Event 对象检查已编辑工作表的名称是否为。如果是这种情况,请执行以下操作: - 使用Range.getRow()检索已编辑行的范围(
sourceRow
以下示例中的变量) 。 MSTR
使用getDataRange()和getValues()从目标工作表(称为 )中检索所有值。- 在目标工作表中找到 A 列等于工作表中 A 列的行
test
(即用户相同)。你可以使用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)修改第二个参数。因此,您应该检索另一个没有 AB 列的源范围,并将该范围设置为 modified 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);
推荐阅读
- javascript - 从 Strig 中删除 "," (并返回 RGB\n 字符串)
- javascript - 设置要从其他文件访问的全局变量 - javascript
- node.js - 如何在 google puppeteer 中正确使用 page.type
- machine-learning - “ValueError:向模型提供符号张量时,我们希望张量具有静态批量大小”是什么意思?
- r - 使用 apply 使用每行中的非空白值创建一个新列
- javascript - 透明导航栏
- c# - 检查两个单独的数组值并抓取最小的一个以将 CW 新数组值插入新数组
- python - 无法修复“列表索引超出范围”
- macos - ImageMagick 错误:zsh:找不到匹配项:画布:mac 中的十六进制颜色
- string - 解析按钮点击活动上的字符串