复制电子表格也会复制所有链接的文件

2024-05-11

当我使用库方法时,我希望能够仅复制电子表格及其所有工作表以及所有定义的工作表名称:

spreadSheet.copy(newSSName);

Or,

myFile.makeCopy(newNameOfFile);

目前,这些方法复制所有链接的表单和表单中使用的脚本。这对于我的需要来说是不必要的副作用,并且会导致驱动器文件夹中出现大混乱。有没有一种方法可以快速有效地完成此操作,而无需逐个单元格、逐个工作表地复制?或者这是唯一的选择?

Thanks.


这个解决方法怎么样?在此解决方法中,Sheets API 用于复制电子表格。对于 Class Spreadsheet 的 copy()、Class File 和 Files: copy of Drive API 的 makeCopy(),复制的电子表格包括绑定的脚本和链接的表单。所以我想到使用Sheets API。此解决方法的流程如下。

  1. 使用spreadsheets.get检索源电子表格的对象。
  2. 通过使用spreadsheets.create 包含检索到的对象来创建新的电子表格。

通过该流程,可以创建不包括绑定脚本和链接表单的复制电子表格。示例脚本如下。当您使用此脚本时,请在高级 Google 服务和 API 控制台中启用 Sheets API。您可以在以下位置查看如何启用 Sheets API:here https://stackoverflow.com/questions/48754286/retrieving-google-sheets-cell-border-style-programmatically/48756509#48756509.

示例脚本:

var fileId = "### fileId of source Spreadsheet ###"; // Please set here.
var obj = Sheets.Spreadsheets.get(fileId, {fields: "namedRanges,properties,sheets"});
Sheets.Spreadsheets.create(obj);

Note :

  • 使用此脚本时,请设置源电子表格的fileId。
  • 在Sheets API的spreadsheets.create中,无法在特定文件夹中创建电子表格。因此,复制的电子表格将创建到根文件夹中。如果您想在特定文件夹中创建它,请在复制电子表格后将其移动。当然,您可以使用脚本来完成。
  • 如果你想包括developerMetadata电子表格,请将其添加到fields.

参考 :

  • 类电子表格的 copy() https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#copy(String)
  • 类文件的 makeCopy() https://developers.google.com/apps-script/reference/drive/file#makeCopy()
  • 文件:Drive API 的副本 https://developers.google.com/drive/api/v3/reference/files/copy
  • 方法:Sheets API的spreadsheets.get https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get
  • 方法:Sheets API的spreadsheets.create https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create

更新日期:2023 年 7 月 7 日

当我再次测试上面的脚本时,在当前阶段,我发现它无法正确使用。因为,现阶段,智能芯片已经实现。在这种情况下,当前规范无法将 Sheets API 作为对象进行检索。因此,作为当前的示例脚本,我想添加它。我回答了这个问题这个线程 https://stackoverflow.com/q/76614461。此外,该脚本使用 Sheets API。因此,请在高级 Google 服务中启用 Sheets API。

使用此功能之前,请先设置spreadsheetId.

const spreadsheetId = "###"; // Please set your Spreadsheet ID.

// Ref: https://tanaikech.github.io/2021/03/26/copying-protections-for-spreadsheet-using-google-apps-script/
function copyProtectedRanges_(srcId, dstId) {
  const obj = Sheets.Spreadsheets.get(dstId, { fields: "sheets(properties(sheetId),protectedRanges(protectedRangeId))" }).sheets
    .reduce((o, s) => {
      o.sheetIds.push(s.properties.sheetId);
      if (s.protectedRanges && s.protectedRanges.length > 0) {
        s.protectedRanges.forEach(({ protectedRangeId }) => o.protectedRangeIds.push({ deleteProtectedRange: { protectedRangeId } }));
      }
      return o;
    }, { sheetIds: [], protectedRangeIds: [] });
  const requests = Sheets.Spreadsheets.get(srcId, { fields: "sheets/protectedRanges" }).sheets
    .reduce((ar, s, i) => {
      if (s.protectedRanges && s.protectedRanges.length > 0) {
        const temp = s.protectedRanges.map(e => {
          delete e.protectedRangeId;
          e.range.sheetId = obj.sheetIds[i];
          if (e.unprotectedRanges) {
            e.unprotectedRanges.forEach(f => f.sheetId = obj.sheetIds[i]);
          }
          return { addProtectedRange: { protectedRange: e } };
        });
        ar = ar.concat(temp);
      }
      return ar;
    }, obj.protectedRangeIds);
  if (requests.length == 0) return;
  Sheets.Spreadsheets.batchUpdate({ requests }, dstId);
}

// Please run this function.
function main() {
  const srcSpreadsheet = SpreadsheetApp.openById(spreadsheetId);
  const dstSpreadsheet = SpreadsheetApp.create(`Copied ${srcSpreadsheet.getName()}`);
  const srcSSId = srcSpreadsheet.getId();
  const dstSSId = dstSpreadsheet.getId();

  DriveApp.getFileById(dstSSId).moveTo(DriveApp.getFileById(srcSSId).getParents().next());
  const temp = dstSpreadsheet.getSheets()[0].setName(Utilities.getUuid());
  srcSpreadsheet.getSheets().forEach(sheet => sheet.copyTo(dstSpreadsheet).setName(sheet.getName()));
  dstSpreadsheet.deleteSheet(temp);

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

复制电子表格也会复制所有链接的文件 的相关文章

随机推荐

  • Kubernetes 的艰难之路 - 如何设置节点不可调度

    我正在从头开始配置 Kubernetes 集群 原因 它是虚拟机内的本地设置 一切都很好 除了master节点被创建为可调度的 我尝试过分配master通过将所需参数传递给 kubelet 二进制文件来对节点进行标签和适当的污点 不能解决问
  • Android Wear Overlay 传递触摸事件

    我有一个 Android Wear 应用程序 其中我使用透明的覆盖视图来接收触摸事件 我需要能够接收屏幕上任何位置发生的所有触摸事件 并且还能够看到它们的坐标 我发现的所有研究都表明我无法接收所有触摸事件并将其传递 然而 and 都在做这样
  • Android 预安装检测

    我的 Android 应用程序将被预安装 我想继续跟踪预安装的应用程序 为此 我需要以某种方式保存密钥或标志 这意味着该应用程序是预安装的 我会将此密钥添加到后端的每个请求中并对其进行分析 我对此有疑问 有一个问题是关于从 Google P
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • 如何使用Android Invalidate()

    在我的主要活动中 我定义了两个视图和一个菜单 浏览次数 1 自定义视图游戏 2 按钮btn 菜单 1 打开项目用于打开文件 菜单布局在不同的活动中定义 基本上 当主活动启动时 它会绘制没有任何内容的自定义视图和按钮 然后我使用菜单中的 打开
  • 从 Qthread 更新 Python GUI 元素

    所以我知道有很多关于使用 Qthread 更新 GUI 中的元素的帖子 我尽了最大努力去检查这些 但仍然有一个问题 我正在尝试创建一个 GUI 该 GUI 在单击按钮时运行一个方法 然后该方法启动一个新线程 然后该线程向 GUI 发出信号以
  • 为什么我可以使用 tsql 连接到 Azure MS SQL,但不能使用 pymssql?

    我今天在哪里 TDSVER 7 3 tsql H example database windows net U me D ExampleDB p 1433 P notreallymypassword 这不会 gt gt gt import
  • Hudson 结帐卡在“git fetch”处

    我正在使用 git 版本 1 6 2 2 1669 g7eaf8 在 Hudson 1 314 上使用 Hudson Git 插件 0 7 3 当我触发构建时 Hudson 执行 git fetch 但它永远不会返回 我把一只卡在那里14天
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • Android studio 问题:找不到广告:AdQuality:未指定

    我已经更新了 Android studio 刚刚打开我的项目 我收到以下错误 您能让我知道如何解决这个问题吗 Error A problem occurred configuring project memoryGameCollection
  • 在 python 中使用 re.sub 将字母变成大写?

    在许多编程语言中 以下内容 find foo a z bar并替换为GOO U 1GAR 将导致整个匹配项变为大写 我似乎无法在 python 中找到等效项 它存在吗 您可以将函数传递给re sub http docs python org
  • 如何通过sparkSession向worker提交多个jar?

    我使用的是火花2 2 0 下面是我在 Spark 上使用的 java 代码片段 SparkSession spark SparkSession builder appName MySQL Connection master spark ip
  • 附加之前检查数据库中是否存在 ID

    我通过选择一个带有类别的数组json decode并将它们附加到文章中 public static function setArticleCategory Request request article Article where id r
  • 将许多表转换为 Excel 列

    我创建了用于文章审阅的网络应用程序 我有一个名为 Article 的表 每个表Article有一些ArticleReview Article ArticleId ArticleTitle NumberOfComment NumberOfVi
  • 我应该增强客户端上的 Jquery Mobile 元素还是发送带有 data-enhance="false" 的增强标记?

    我有一个产品搜索 我正在发送回结果 每个结果都包含两个按钮 JQM 控制组 我一次发送 24 条记录 因此需要增强 24 个控制组 如下所示 div class submitButton linkBox div
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 复制电子表格也会复制所有链接的文件

    当我使用库方法时 我希望能够仅复制电子表格及其所有工作表以及所有定义的工作表名称 spreadSheet copy newSSName Or myFile makeCopy newNameOfFile 目前 这些方法复制所有链接的表单和表单