首页 > 解决方案 > 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);
  }
}

标签: google-apps-scriptgoogle-sheetscopyto

解决方案


  • 使用onEdittest触发器,使用相应的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);

推荐阅读