无需Query和Importrange,如何自动复制Google Sheets行数据(仅值)?
用Google Apps Script实现Google Sheets纯值自动复制教程
完全可以用Google Apps Script实现你的需求,以下是针对新手的详细操作步骤:
1. 获取表格ID
打开你的源表格和目标表格,从浏览器地址栏里提取它们的ID:
地址栏格式类似:https://docs.google.com/spreadsheets/d/表格ID/edit...
把表格ID那串字符记下来,后面要用到。
2. 打开脚本编辑器
在源表格里,点击顶部菜单栏的「扩展」→「Apps Script」,会打开一个新的脚本编辑页面。把默认的function myFunction() {}代码删掉。
3. 编写复制脚本
把下面的代码粘贴到编辑器里,然后替换代码里的占位内容:
function copyRowsAsValues() { // 替换成你的源表格ID和工作表名称(比如"Sheet1") const sourceSheetId = "你的源表格ID"; const sourceSheetName = "源工作表名"; // 替换成你的目标表格ID和工作表名称 const targetSheetId = "你的目标表格ID"; const targetSheetName = "目标工作表名"; // 获取源工作表的所有纯值数据 const sourceSheet = SpreadsheetApp.openById(sourceSheetId).getSheetByName(sourceSheetName); const sourceData = sourceSheet.getDataRange().getValues(); // 获取目标工作表 const targetSheet = SpreadsheetApp.openById(targetSheetId).getSheetByName(targetSheetName); // 可选:如果要覆盖目标表格原有数据,取消下面一行的注释 // targetSheet.clearContents(); // 将数据追加到目标表格最后一行之后 const targetStartRow = targetSheet.getLastRow() + 1; targetSheet.getRange(targetStartRow, 1, sourceData.length, sourceData[0].length).setValues(sourceData); }
代码说明:
getValues():专门提取单元格的纯文本/数值,不会携带公式setValues():把纯值写入目标表格,同样不会生成公式- 如果不需要追加,而是要覆盖目标表格内容,取消
targetSheet.clearContents();的注释即可
4. 测试脚本
点击编辑器顶部的「运行」按钮(三角形图标),第一次运行会弹出授权提示:
- 点击「查看权限」→选择你的谷歌账号
- 点击「高级」→「转到XX脚本(不安全)」(这是你自己写的脚本,完全安全)
- 点击「允许」完成授权
授权完成后,脚本会自动执行,去目标表格检查数据是否正确复制(都是纯值,没有公式)。
5. 设置自动触发(可选)
如果需要脚本自动运行(比如源表格更新时自动复制,或者每天定时执行):
- 点击编辑器左侧的时钟图标「触发器」
- 点击右下角「添加触发器」,按以下设置:
- 选择要运行的函数:
copyRowsAsValues - 选择事件源:
- 若要源表格有编辑时自动复制:选「电子表格」→事件类型「编辑时」
- 若要定时执行:选「时间驱动」→设置你需要的频率(比如每天上午9点)
- 选择要运行的函数:
- 点击「保存」即可
进阶:只复制新增行(避免重复)
如果不想每次都复制全部数据,只复制新增的行,可以用下面的脚本:
function copyNewRowsAsValues() { const sourceSheetId = "你的源表格ID"; const sourceSheetName = "源工作表名"; const targetSheetId = "你的目标表格ID"; const targetSheetName = "目标工作表名"; const sourceSheet = SpreadsheetApp.openById(sourceSheetId).getSheetByName(sourceSheetName); const targetSheet = SpreadsheetApp.openById(targetSheetId).getSheetByName(targetSheetName); // 用源表格的A1单元格记录上次复制的最后一行号(第一次运行时A1留空即可) const lastCopiedRow = sourceSheet.getRange("A1").getValue() || 0; const currentLastRow = sourceSheet.getLastRow(); // 只有当源表格有新增行时才执行复制 if (currentLastRow > lastCopiedRow) { const newData = sourceSheet.getRange(lastCopiedRow + 1, 1, currentLastRow - lastCopiedRow, sourceSheet.getLastColumn()).getValues(); const targetStartRow = targetSheet.getLastRow() + 1; targetSheet.getRange(targetStartRow, 1, newData.length, newData[0].length).setValues(newData); // 更新A1单元格的记录,下次只复制之后的新增行 sourceSheet.getRange("A1").setValue(currentLastRow); } }
使用这个脚本时,记得把触发器绑定到copyNewRowsAsValues函数。
内容的提问来源于stack exchange,提问作者Cheker
相关产品推荐
相关产品推荐

