Google Apps Script是Google提供的轻量级脚本平台,能够直接操作Google Workspace系列产品的各类数据,其中对Google表格的自动化操作是非常常见的使用场景。当我们需要精确复制表格中用户手动选定的行数据时,通过脚本可以实现一键完成,避免手动操作的误差。

实现思路梳理
要实现精确复制选定行数据的功能,核心步骤可以分为三个部分:
- 获取当前用户的活动表格和选定区域信息
- 提取选定行对应的所有单元格数据
- 将提取到的数据写入到指定的目标位置
具体实现步骤
1. 创建脚本文件
打开需要操作的Google表格,点击顶部菜单栏的扩展程序,选择Apps Script,即可进入脚本编辑页面,系统会自动创建一个新的脚本文件。
2. 编写核心脚本代码
以下是完整的实现代码,包含获取选定行、复制数据、粘贴数据的完整逻辑:
function copySelectedRow() {
// 获取当前活跃的表格
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 获取用户当前选定的区域
var selection = sheet.getSelection();
var selectedRanges = selection.getActiveRangeList().getRanges();
// 校验是否只选定了一行
if (selectedRanges.length !== 1 || selectedRanges[0].getNumRows() !== 1) {
SpreadsheetApp.getUi().alert("请仅选定一行数据进行复制");
return;
}
var selectedRange = selectedRanges[0];
// 获取选定行的行号
var rowIndex = selectedRange.getRow();
// 获取选定行的所有数据
var rowData = selectedRange.getValues()[0];
// 获取表格的总列数
var lastColumn = sheet.getLastColumn();
// 定义目标粘贴位置,这里默认粘贴到下一行,可根据需求修改
var targetRow = rowIndex + 1;
// 如果目标行超出当前数据范围,自动插入新行
if (targetRow > sheet.getLastRow()) {
sheet.insertRowAfter(rowIndex);
}
// 将选定行的数据写入目标行
sheet.getRange(targetRow, 1, 1, lastColumn).setValues([rowData]);
SpreadsheetApp.getUi().alert("选定行数据已成功复制到第" + targetRow + "行");
}
3. 添加自定义菜单触发脚本
为了方便使用,我们可以给脚本添加一个自定义菜单,不需要每次都进入脚本编辑器运行:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu("自定义操作")
.addItem("复制选定行", "copySelectedRow")
.addToUi();
}
保存脚本后刷新表格页面,顶部菜单栏就会出现自定义操作选项,点击其中的复制选定行即可运行脚本。
代码逻辑解析
代码中首先通过SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()获取当前操作的表格对象,再通过getSelection()方法拿到用户的选定区域。为了避免用户选定多行或者多个不连续区域导致复制错误,代码中加入了校验逻辑,只有选定单行时才会执行后续操作。
提取数据时通过getValues()方法拿到选定区域的所有值,由于选定的是单行,所以返回的是一个二维数组,取第一个元素就是该行的所有数据。粘贴时默认将目标行设置为选定行的下一行,如果下一行不存在则自动插入新行,保证数据可以正常写入。
常见问题说明
- 如果选定行包含公式,复制后目标行会显示公式的计算结果,如果需要保留公式,可以将
getValues()替换为getFormulas(),同时粘贴时使用setFormulas()方法。 - 如果需要复制选定行的格式,可以在数据复制完成后,通过
copyFormatToRange()方法将选定行的格式同步到目标行。 - 脚本运行后如果没有反应,可以检查是否授予了脚本操作表格的权限,首次运行脚本时系统会弹出权限申请提示,点击允许即可。
Google_Apps_ScriptGoogle_Sheets行数据复制表格脚本修改时间:2026-07-11 05:21:32