在 Google Apps 脚本中将整个工作表替换为另一个工作表

2024-04-06

我想要做的是将电子表格中特定工作表中的信息存储起来,并在每天结束时将其复制到第二个电子表格中。第二个电子表格将根据复制的信息运行复杂的数据透视表和报告,而无需全天运行。

我可以设置一个时间驱动触发器 https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers它将每天在一小时内运行该作业。

我正在编写以下脚本,该脚本使用SpreadsheetApp.getActiveSpreadsheet https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#getActiveSpreadsheet()获取当前电子表格。然后获取要备份的单个工作表spreadsheet.getSheetByName https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetByName(String)。然后使用sheet.copyTo https://developers.google.com/apps-script/reference/spreadsheet/sheet#copyTo(Spreadsheet)方法将当前工作表添加到新电子表格中。我通过查找 id 来获取新的电子表格SpreadsheetApp.openById https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openById(String)都是这样的:

function startBackupJob() {

  var currentSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
  var masterSheet = currentSpreadSheet.getSheetByName("Sheet1")

  var backupSpreadSheetId = "#######################################";
  var backupSpreadSheet = SpreadsheetApp.openById(backupSpreadSheetId);

  // var backupSheet = backupSpreadSheet.getSheetByName("Sheet1");
  // backupSpreadSheet.deleteSheet(backupSheet);

  masterSheet.copyTo(backupSpreadSheet).setName("Sheet1");

}

我遇到的问题是copyTo将创建一个新的工作表而不是覆盖现有的电子表格。移动到新工作簿的目的是根据数据运行数据透视表,而不是重新连接它们以指向新工作表。

我可以删除上一张工作表,为新工作表腾出空间,但这也会杀死数据透视表上的引用,因此没有多大帮助。

有没有一种简单的方法可以将一个工作表的全部内容转移到另一个工作表?


这类似于(但不同于)以下问题:

  • 如何编写脚本将电子表格的备份副本复制到存档文件夹? https://stackoverflow.com/q/11839952/1366033- 但是,我不想移动整个文件,而是移动电子表格中的特定工作表。
  • 如何使用谷歌脚本将详细信息表复制到另一个电子表格 https://stackoverflow.com/q/17099497/1366033 & 将一个电子表格复制到另一个电子表格并设置格式 https://stackoverflow.com/q/19791132/1366033- 但是复制会生成一个新工作表,而我需要替换现有工作表的内容
  • 脚本,每天在特定时间将单元格从一张纸复制到另一张纸 https://stackoverflow.com/q/24500761/1366033- 但是,我确实想替换整个工作表,而不仅仅是工作表中的特定单元格。

Update

我也许可以通过打电话来做到这一点getRange https://developers.google.com/apps-script/reference/spreadsheet/sheet#getRange(Integer,Integer,Integer,Integer)在每张纸上然后使用getValues https://developers.google.com/apps-script/reference/spreadsheet/range#getValues() and setValues https://developers.google.com/apps-script/reference/spreadsheet/range#setValues(Object)像这样:

var currentValues = masterSheet.getRange(1, 1, 50, 50).getValues()
backupSheet.getRange(1, 1, 50, 50).setValues(currentValues)

但我担心主表具有与备份表不同的可用范围的边缘情况。我也不想在该范围内进行硬编码,而是希望它包含整个工作表。如果我打电话.getRange("A:E")那么两个工作表必须具有完全相同的行数,这是不可能的。


您的更新已经完成了大约 90%。诀窍是在将数据复制到目标工作表之前明确检查目标工作表的大小。例如,如果我做了这样的事情:

var cromulentDocument = SpreadsheetApp.getActiveSpreadsheet();
var masterSheet = cromulentDocument.getSheetByName('master');
var logSheet = cromulentDocument.getSheetByName('log');
var hugeData = masterSheet.getDataRange().getValues();
var rowsInHugeData = hugeData.length;
var colsInHugeData = hugeData[0].length;

/* cross fingers */
logSheet.getRange(1, 1, rowsInHugeData, colsInHugeData).setValues(hugeData);

...那么我的成功将完全取决于是否logSheet至少有那么大masterSheet。这是显而易见的,但更重要的是,如果logSheet is bigger那么边缘就会留下一些旧垃圾。不好。

让我们尝试一些别的东西。和以前一样,我们将获取主数据,但我们也会调整大小logSheet。如果我们不关心logSheet太大了,我们可能可以clear()其中的数据,但让我们保持整洁。

var cromulentDocument = SpreadsheetApp.getActiveSpreadsheet();
var masterSheet = cromulentDocument.getSheetByName('master');
var logSheet = cromulentDocument.getSheetByName('log');
var hugeData = masterSheet.getDataRange().getValues();
var rowsInHugeData = hugeData.length;
var colsInHugeData = hugeData[0].length;

/* no finger crossing necessary */
var rowsInLogSheet = logSheet.getMaxRows();
var colsInLogSheet = logSheet.getMaxColumns();

/* adjust logSheet length, but only if we need to... */
if (rowsInLogSheet < rowsInHugeData) {
  logSheet.insertRowsAfter(rowsInLogSheet, rowsInHugeData - rowsInLogSheet);
} else if (rowsInLogSheet > rowsInHugeData) {
  logSheet.deleteRows(rowsInHugeData, rowsInLogSheet - rowsInHugeData);
}

/* likewise, adjust width */
if (colsInLogSheet < colsInHugeData) {
  logSheet.insertColumnsAfter(colsInLogSheet, colsInHugeData - colsInLogSheet);
} else if (colsInLogSheet > colsInHugeData) {
  logSheet.deleteColumns(colsInHugeData, colsInLogSheet - colsInHugeData);
}

/* barring typos, insert data with confidence */
logSheet.getRange(1, 1, rowsInHugeData, colsInHugeData).setValues(hugeData);

这里发生的事情非常简单。我们计算出日志需要有多大,然后调整目标工作表的大小以匹配该数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Google Apps 脚本中将整个工作表替换为另一个工作表 的相关文章

  • 如何在链接到表单的工作表中执行 Google 工作表脚本之前等待 Google 表单脚本完成执行

    我有两个脚本 一个链接到 Google 表单 另一个链接到 Google 表格 我需要确保 Google 表单脚本在执行链接到 Google 表单的工作表的 Google 工作表脚本主体之前完成执行 如何才能做到这一点 需要等待 Googl
  • 是否可以将 .gs 文件上传到复制的 Google 文档的应用程序脚本项目?

    我复制了一个电子表格供多人使用 并附加了脚本 我的问题是如何修改项目中的脚本 而不必将每个更改复制并粘贴到 gs项目中的文件 This is the base document from which the other versions w
  • 从 Gmail 获取 pdf 附件作为文本

    我在网络和 Stack Overflow 上搜索但没有找到解决方案 我尝试做的事情如下 我通过邮件收到某些附件 我希望将其作为 纯 文本进行进一步处理 我的脚本如下所示 function MyFunction var threads Gma
  • 将活动工作表作为电子邮件附件从 Google 工作表发送

    我有一个谷歌表单 可以捕获电子表格中的响应 目前 每次做出新响应时 它都会创建一个新工作表 我现在尝试将 邮寄活动工作表脚本 添加到创建新工作表的现有脚本中 但是我收到错误 请求失败https docs google com spreads
  • 服务不可用:复制 Google 文档时出现 DOCS

    突然遇到一个问题 即 Google DOCS 服务在调用一些复制元素后失败 有趣的是 它实际上复制了第一个元素 但是当它进入 for 内的第二个循环时 它失败并给出以下错误 服务不可用 文件 该脚本在我们公司内部发布后 可以正常运行几个月
  • 复制电子表格也会复制所有链接的文件

    当我使用库方法时 我希望能够仅复制电子表格及其所有工作表以及所有定义的工作表名称 spreadSheet copy newSSName Or myFile makeCopy newNameOfFile 目前 这些方法复制所有链接的表单和表单
  • 如何在多个工作表上运行脚本,Google Sheets

    我有一个脚本 想在 Google 工作表中的特定选项卡上运行 但不一定在所有选项卡上运行 我尝试执行两个不同名称的脚本 但只有最后一个保存的脚本会运行 如何编写此脚本以在特定选项卡上运行 这是我的开始脚本 function onEdit v
  • 一起使用“过滤”和“排序”的 Google 表格

    这是我的第一个问题 我希望一切都好 我是使用谷歌表格的新手 但我正在慢慢进步 我正在尝试构建一个工作表 其中包含工作表 1 中的所有数据 在工作表 2 上 我想过滤工作表 2 中 D 列中标有数字 1 的所有数据 为此 我正在使用 FILT
  • 通过 Apps 脚本强制刷新公式

    有时 更改单元格的值时 电子表格中的公式不会自动刷新 并且单元格上会出现注释以选择该单元格 然后按 CTRL SHIFT E 强制重新加载公式 我想从 Apps 脚本调用此重新加载函数 有没有办法用 Apps 脚本来做到这一点 我尝试了 S
  • 使用应用程序脚本将 MS Word 文件(保存在云端硬盘中)转换为 Google 文档

    我被某些事情困住了 找不到解决办法 有没有办法使用文件 url 或 id 将存储在 Google Drive 中的 MS Word 文件转换为 Google 文档 我目前有一个电子表格 其中包含文件的网址 或者 也可以使用 python 脚
  • 如何求Google电子表格中每列的最大值之和?

    我有一个谷歌数字电子表格 如何从每列中获取最大值 并仅使用one公式 没有临时单元 没有脚本 1 2 1 0 1 3 0 2 0 对于上表 结果应为 6 1 2 3 每列的最大值 但我想要一个也适用于更大的表的解决方案 作为一个更普遍的问题
  • 使用 Promise 对 Google 表格进行多次查询

    我是一名初学者编码器 需要一些帮助来加快我的 Google 表格查询速度 我环顾四周 找不到解决方案 我正在尝试快速对 Google 表格运行 25 个查询 这就是我的尝试方式 对 Google 工作表运行查询 将结果推送到数组 运行不同的
  • 如果行值存在于另一个工作表中,则将其复制到新工作表

    我是 Google 脚本新手 需要创建一个脚本 我找到了这个question https stackoverflow com questions 22008331 google script delete row if a value in
  • 在Google电子表格中划分整列

    我是 Google 电子表格的一个相对较新的用户 我希望 B 列中的每个单元格都是 A 列 同一行 中内容除以 5 的结果 B1 B2 B3 等 商 应为 A1 A2 A3 等 被除数 除以 5 除数 在示例中 B1 A1 5 我知道一项一
  • 查询新的谷歌电子表格

    我使用谷歌可视化创建了一个折线图 该代码查询谷歌电子表格 当我使用普通电子表格 第 1 行 时 它可以工作 当我使用新的谷歌电子表格 第 2 行的 URL 时 出现以下错误 Error in query request time out 我
  • Google Apps 脚本:比较日期

    我在比较 Google Apps 脚本中的日期时遇到了一个奇怪的问题 为此 我的工作表在 cell getValue 中有一个日期 所以 e range setNote cell getValue startDate 行中 注释显示两个看起
  • Google Sheets 自定义数字格式、颜色规范

    我有一个自定义的百分比数字格式 这是代码 Green 0 0 Red 0 0 输出预览 Positive 123 456 0 Green Negative 123 456 0 Red 我想要绿色更深一些 我已经尝试过了 Dark Green
  • 如何在 Google 文档之间复制内容和格式?

    我需要复制 Google 文档的内容 并将其附加到另一个文档 如果我使用这样的东西 newDoc getBody appendParagraph template getText 我得到了文本 但丢失了原始文件中的格式 Bold Itali
  • 将身份验证从一个 Google Apps 脚本网络应用程序传递到另一 Google Apps 脚本网络应用程序

    我的 Google Apps 帐户中有两个 Google Apps 脚本 两者均已发布为具有以下设置的网络应用程序 脚本A 像我一样执行谁有权访问网络应用程序 XXXXXXX com 内的任何人 脚本B 以访问应用程序的用户身份执行谁有权访
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在

随机推荐

  • ggplot2:在右侧为一个变量创建第二个 y 轴

    我有一个数据框 在同一时间范围内包含 3 个不同的变量 前两个变量具有相同的比例 股票指数值 可以用 y 轴来说明 第三个变量是利率 范围仅为 0 到 7 因此我专注于在图的右侧创建一个额外的 y 轴来说明它 但经过两天的尝试和失败后 我在
  • 使用powershell获取csv文件中的特定单元格值

    我是 powershell 的新手 不经常使用它 我需要使用 powershell 从 csv 文件输出单元格 A5 的值 我的文件 col1 col2 col3 col4 1002 1005 1006 1007 需要 A1 单元格中的值
  • 无法使用 getDeclaredFields() 检索 Scala 类的字段

    我正在尝试将 Java 库 JOhm 与 Scala 一起使用 并注意到当该库尝试使用以下内容读取我的 Scala 类的字段时它会失败model getClass getDeclaredFields 然后我决定尝试在 Scala 解释器中用
  • 如何在输入按钮中的访问键下划线

    我有一个按钮 我想在访问密钥字母下划线 u u 不起作用 并且C 818 C 改变字体 应该是verdana
  • 带有自定义参数的 Html.DropDownListFor()

    我想在 HTML 帮助程序中添加扩展方法来生成这样的选择和选项
  • 如何使用默认集合和数据创建 Mongo Docker 镜像?

    我需要这里的支持来构建我自己的 mongo docker 镜像 我有一个脚本列表 用于创建数据并将其插入 MongoDB 这些脚本应在我的 Dockerfile 中调用 以提供具有默认集合和数据的 docker 映像 这是我的 Docker
  • 具有依赖预设参数的函数

    请考虑简单的功能 def fun x y param1 10 param2 param1 3 do something Where param1 and param2不应是必需的 但可以由用户设置 如果param2未设置 值取决于param
  • EaselJS - 检测碰撞的最佳方法

    我正在尝试为我的 easelJS 小应用程序找到一种碰撞检测的好方法 我刚刚使用 createjs Shape 创建了 2 个矩形 但是创建一个矩形形状后 API 不让我知道矩形的宽度和高度 我不知道为什么 EaselJS Shape 有一
  • 使用 CSS 动态清除浮动

    我正在尝试用 CSS 创建一个 3 列的博客布局 对于每个新帖子 都会在容器 div 内动态添加一个新的 div 但是 由于我无法手动放置清除元素 因此我在清除浮动时遇到了麻烦 现在看起来是这样的 http jsfiddle net DZA
  • 如何在 Spring Boot 中从 RESTful 控制器返回 HTML 页面?

    我想从控制器返回一个简单的 HTML 页面 但我只得到文件的名称而不是其内容 为什么 这是我的控制器代码 RestController public class HomeController RequestMapping public St
  • 如何使用 git 撤消推送的提交?

    我在远程存储库中有一个项目 与本地存储库 开发 和服务器存储库 产品 同步 我一直在进行一些已提交的更改 这些更改已推送到远程并从服务器中拉出 现在 我想撤消这些更改 所以我可以git checkout到更改之前的提交并提交新的更改 但我猜
  • 按 ProductFlavor 和 buildType 划分的 Gradle SourceSets

    EDIT口味和路径 目前我有 sourceSets whenObjectAdded sourceSet gt def sourceData rootProject ext sourceSet name sourceSet java srcD
  • ASP.NET身份重置密码

    如何在新的 ASP NET Identity 系统中获取用户的密码 或者在不知道当前密码的情况下如何重置 用户忘记密码 或者在不知道当前密码的情况下如何重置 用户忘记密码 如果您想使用 UserManager 更改密码 但不想提供用户的当前
  • Leafletjs GeoJSON 层不适用于来自自然地球的地图数据

    我正在使用 leafletjs 使用 OSM 瓷砖绘制地理地图 我使用以下 GeoJSON 作为地图层http code highcharts com mapdata 1 0 0 custom world js http code high
  • 使用 Javamail 访问 Microsoft Exchange 邮箱(IMAP、MS Exchange)

    我需要通过 IMAPS JavaMail 连接到 Microsoft Exchange Server 首先 我得到了 A1 NO AUTHENTICATE failed javax mail AuthenticationFailedExce
  • Android线程可运行性能

    我想知道两种不同的启动可运行方法的性能和 cpu ram 要求 我有一些代码每 10 毫秒收集一次传感器数据 并将这些值插入到后台线程上的数据库中 使用单线程执行器 Executor服务创建如下 executor Executors new
  • ng2 - DevExtreme 与 Telerik Kendo UI [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在开发一款使用 Angular2 Typescript 和 HTML5 的新软件 对于 UI 组件 我们有 2 个选项 开发极限 Tele
  • RE 错误:Mac OS X 上的非法字节序列

    我正在尝试替换 Mac OS X 上 Makefile 中的字符串以交叉编译到 iOS 该字符串嵌入了双引号 命令是 sed i s iphoneos cross llvm gcc O3 iphoneos cross clang Os g
  • tsvector只支持英文?

    我做了以下事情 ALTER TABLE blog entry ADD COLUMN body tsv tsvector CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON blo
  • 在 Google Apps 脚本中将整个工作表替换为另一个工作表

    我想要做的是将电子表格中特定工作表中的信息存储起来 并在每天结束时将其复制到第二个电子表格中 第二个电子表格将根据复制的信息运行复杂的数据透视表和报告 而无需全天运行 我可以设置一个时间驱动触发器 https developers goog