Spreadsheet.getNamedRanges() 不返回 DELETED 工作表中定义的 NamedRanges

2024-07-04

我有一个复杂的电子表格,其中每个选项卡都有许多在不同工作集中定义的命名范围(例如 Tab_A、Tab_B、... Tab_X)。我试图将此电子表格分解为较小的独立电子表格(假设独立电子表格 1 只有 Tab_A、Tab_B),方法是首先复制原始大型电子表格并剪掉我不需要的工作表,然后尝试清理命名范围。我试图摆脱现在已删除的工作表中定义的所有现在无效的命名范围。

我尝试运行这个脚本...

function ListInvalidNamedRanges() { 
  var spreadsheet = SpreadsheetApp.getActive();
    
  /* remove named range if match or partial match with Tab Name reference */
  var namedRangeList = spreadsheet.getNamedRanges();
  for (var j=0; j<namedRangeList.length; j++) {
    var namedRangeName = namedRangeList[j].getName();
    // Do not use includes - ECMA-6 not supported in AppScript
    try {  
      var namedRange = namedRangeList[j].getRange();
      var valueToTriggerErrorIfApplicable = namedRange.getValue(); // force error if necessary
      Logger.log("Try: Valid named range: %s; Range: %s; Value: %s; j: %s", namedRangeName,namedRange, valueToTriggerErrorIfApplicable, j  );
    }
    catch(e) {
      Logger.log("Catch: Invalid named range: %s; Range: %s; Value: %s", namedRangeName,namedRange, valueToTriggerErrorIfApplicable  );
      // namedRangeList[j].remove();
    }
  }                        
}

问题是spreadsheet.getNamedRanges()不会返回现在删除的选项卡中定义的命名范围列表,但它们确实显示在命名范围 UI 中,如下图所示。

View of named images using the UI

有没有替代的电话spreadsheet.getNamedRanges()返回完整列表?

有太多垃圾 NamedRanges 无法从 UI 中一次删除一个(甚至录制宏也不起作用,因为这些垃圾 NamedRanges 似乎也无法通过宏中的 appscript 访问)。我不止一次有这个用例,所以我尝试以脚本驱动的方式来完成此操作。

通过这个仅包含 2 个工作表的更简单的测试用例,可以轻松看出这一点。

这是测试电子表格的“删除之前”版本。为自己创建一个本地副本。https://docs.google.com/spreadsheets/d/1XVTmOMROWuCO640eBnNDF2WpVZFU4UA854pabvYd1ZE/edit?usp=sharing https://docs.google.com/spreadsheets/d/1XVTmOMROWuCO640eBnNDF2WpVZFU4UA854pabvYd1ZE/edit?usp=sharing.

Output of running the AppScript utility BEFORE deleting the 1st-worksheet

现在,删除第一个工作表 W1-to-be-deleted。

This is what shows up in the Named Range UI

这是运行 AppScript 函数时显示的内容

Output of running the Appscript function AFTER the worksheet delete


问题和解决方法:

不幸的是,在现阶段,命名范围似乎#REF无法通过 Google 电子表格服务 (SpreadsheetApp) 和 Sheets API 检索。由此,命名范围#REF当前规范无法直接删除。而且,这似乎已经报告给谷歌问题跟踪器。Ref https://issuetracker.google.com/issues/126262167

从上述情况来看,在这种情况下,我想提出一种解决方法来删除命名范围#REF。此解决方法的流程如下。

  1. 将 Google 电子表格转换为 XLSX 数据。
  2. Remove the named ranges of #REF in XLSX data.
    • 幸运的是,Microsoft Excel 的详细规范以 Open XML 形式发布。此解决方法使用它。当Google电子表格转换为XLSX数据时,XLSX数据可以作为XML数据进行编辑。
  3. 将 XLSX 数据转换为 Google 电子表格。

通过这个流程,命名范围#REF可以删除。

重要的:

当Google Spreadsheet转换为XLSX数据时,通过Google Spreadsheet中的函数,可能无法实现完整的转换。例如,复选框无法转换。所以,请小心这一点。所以,首先请测试一下这个解决方法,并确认您的电子表格是否可以根据您的实际情况正常使用。

示例脚本:

在此示例脚本中,为了将 XLSX 转换为 Google 电子表格,使用了 Drive API。所以,请在高级 Google 服务中启用 Drive API https://developers.google.com/apps-script/guides/services/advanced#enable_advanced_services.

function removeInvalidNamedRanges() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const url = "https://docs.google.com/spreadsheets/export?exportFormat=xlsx&id=" + ss.getId();
  const name = "xl/workbook.xml";
  const blob = UrlFetchApp.fetch(url, { headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() } }).getBlob().setContentType(MimeType.ZIP);
  const blobs = Utilities.unzip(blob);
  const xml = blobs.find(b => b.getName() == name).getDataAsString();
  const root = XmlService.parse(xml).getRootElement();
  root.getChild("definedNames", root.getNamespace()).getChildren().forEach(e => {
    if (e.getValue() == "#REF!") e.detach();
  });
  const newBlobs = [...blobs.filter(b => b.getName() != name), Utilities.newBlob(XmlService.getRawFormat().format(root), MimeType.XML, name)];
  Drive.Files.insert({ title: `Modified_${ss.getName()}`, mimeType: MimeType.GOOGLE_SHEETS }, Utilities.zip(newBlobs).setContentType(MimeType.MICROSOFT_EXCEL));
}
  • 当这个脚本运行时,上面的流程就完成了。通过此,您可以看到在根文件夹中创建了一个新的电子表格。当您打开新的电子表格时,您可以看到无效的命名范围#REF被删除。

Note:

  • 当然,活动电子表格可以被转换后的 XLSX 数据覆盖。但是,在这种情况下,我建议将其创建为新的 Google 电子表格。因为当原始电子表格被覆盖时,它可能不是您预期的结果。

参考:

  • 文件:插入 https://developers.google.com/drive/api/v2/reference/files/insert
  • 类 XmlService https://developers.google.com/apps-script/reference/xml-service/xml-service
  • 定义名称类 https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.definedname?view=openxml-2.8.1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spreadsheet.getNamedRanges() 不返回 DELETED 工作表中定义的 NamedRanges 的相关文章

  • google apps 脚本 ==> UrlFetchApp、方法 GET 和 cookie

    我使用 UrlFetchApp 发送用户和密码 POST 方法 获取cookie后 并在其他请求中使用 GET方法 但是这个新请求不起作用 我认为这个 cookie 在这个新请求中没有正确使用 谁能帮我 var opt method pos
  • 引入 V8 后,Google Apps 脚本无法为其他用户完全执行

    我编写了一个脚本 得到了这里好心人的大力帮助 该脚本使用 Google Sheets 脚本复制 Google Drive 上的文件夹 和内容 它运行了很长一段时间 但后来我启用了 V8 引擎 现在已禁用 问题是 它仍然适用于我 也许还有其他
  • Google Apps 脚本 - 脚本之间的通信

    Hi我的问题如下 我想创建一个小网页 在该网页上可以在 Google 日历中创建事件 但有一些限制 就我而言 我的室友可以编辑此日历来预订洗衣机 该预订不能重叠 而且我们所有人的使用天数都是有限的 我创造了私人日历 我已经创建了验证请求的脚
  • Google 表格 - 提取数字及其测量单位

    我想要一个可以从文本中提取数字及其测量单位的函数 例如在 A2 中我有 这个盒子重5公斤 另一个盒子重10公斤 所以我想要一个会返回的函数 5kg 10kg 注意 我希望该函数适用于任何测量单位 而不仅仅是 kg 我是谷歌表格的初学者 因此
  • 如何从 Google Apps 脚本小工具重定向到另一个网页?

    我正在 Google 协作平台中构建一个网络应用程序 目前 我有两个表单 第一个表单加载电子表格并将其显示为表格 然后当您从表中选择一行时 脚本会使用 GET 请求和一些参数调用另一个 Web 应用程序 如 rowIndex X colum
  • Google 表格脚本 - onEdit 和“源”

    我已经努力了几天 试图让脚本发挥作用 在最基本的层面上 我的函数包含以下内容 function onEdit e var changedRange e source getActiveRange 根据谷歌的文档 这似乎是完全合法的用途 ht
  • Google Script:如何突出显示一组单词?

    我想为谷歌文档编写一个脚本来自动突出显示一组单词 一句话 我可以使用这样的脚本 function myFunction var doc DocumentApp openById ID var textToHighlight TEST var
  • 列的总和值。循环依赖

    我不知道如何用语言表达 但我需要我所意识到的 随附的电子表格中有两张表 现在怎么样 和 应该怎么样 我在其他工作表中使用了这个公式 但现在它不能正常工作 ArrayFormula IF ROW A A 1 SUM INDIRECT D2 D
  • 使用 Google Apps 脚本从网页提取数据时的字符编码问题

    我已经使用 Google Apps 脚本编写了一个脚本 将网页中的文本提取到 Google 表格中 我只需要这个脚本来处理特定的网页 因此它不需要是通用的 该脚本几乎完全按照我想要的方式工作 除了我遇到了字符编码问题 我正在提取希伯来语和英
  • 超出 Google 电子表格上的 ImportXML 限制

    我现在陷入了 抓取问题 特别是我想将作者的姓名从网页提取到谷歌电子表格 其实功能 IMPORTXML A2 span class author vcard meta item 正在工作 但是当我增加了要抓取的链接数量后 它就开始无限加载 所
  • 发送电子邮件的 Google Apps 脚本语法错误。无法识别我的问题

    我正在尝试让 Google 工作表从工作簿中另一张工作表的长列表中发送个性化电子邮件 我使用了教程 因为我是所有编码语言的认证新手 但 AppScript 告诉我第 4 行有语法错误 我一生都无法弄清楚我做错了什么 但我确信当由具有这些合法
  • 有没有办法让两张纸保持同步?

    无法仅共享 Google 文档中的一张电子表格 因此 您必须共享整个电子表格 因此 我正在考虑编写一个脚本来同步两个工作表 每个工作表位于不同的电子表格中 我想使用一个函数来获取行作为数组来做到这一点 有更好的策略来做到这一点吗 实现此目的
  • Google App Script如何使用HTML服务加载不同的页面?

    如何以编程方式使用 HTML 服务在 doGet 中加载不同页面 如果不可能 为什么GAS编辑器允许创建不同的HTML页面 如果您根据 URL 中传递的参数加载不同的页面 您可以使用以下命令测试参数 function doGet e if
  • 如何将 Charts.Chart 嵌入 Google Sheet(脚本应用程序)

    我正在寻找一种方法来嵌入Charts Chart到 Google 表格 但不仅如此 我还希望能够将其插入到其他支持中 例如用户表单 Google 文档等 function generateChart data var chartBuilde
  • 查找、匹配和连接

    我需要一个公式 函数来连接一列和多行的单元格值 匹配条件应用于不同的列 这是我必须做的事情的例子 Islington Bunhill EC2M Islington Bunhill EC2Y Islington Bunhill N1 Barn
  • 日历 API 已消失,无法添加到 Google AppS 脚本中

    我开发了一个 Google 日历触发器 只要用户的日历发生更改 它就会运行并执行一些操作 最近我不得不改变一些基本上检查事件可见性的东西 像这样的事情 if event getVisibility GoogleAppsScript Cale
  • 自动筛选与显示所有数据

    Background 自从最近我开始了解一个秘密命名范围 它是通过使用创建的AutoFilter 通常 如果不是总是 这被称为 FilterDatabase 我想过玩一下这个 但后来陷入了困境Range它所指的对象 让我用下面的例子来解释一
  • 类型错误:无法调用 null 的方法“getActiveSheet”。在 myFunction(代码:6)

    在日志中我可以看到应用程序已被定义为 SpreadsheetApp 但 getActiveSpreadsheet 返回 null 这反过来又导致 getActiveSheet 说它无法调用带有 null 的方法 我已经尝试清除浏览器历史记录
  • 币安加密货币交易所 API“/account”401 响应

    我在使用 Google Sheet 中的脚本调用 Binance cryptoexchange API 时遇到问题 我已经使用示例中的数据检查了我的签名处理https www binance com restapipub html user
  • 通过谷歌脚本垂直对齐谷歌电子表格上的文本

    我想弄清楚如何在中间垂直对齐文本 根据文档 我发现我的以下示例应该有效 var form FormApp getActiveForm var ss SpreadsheetApp openById form getDestinationId

随机推荐

  • 连接到主机 localhost 端口 22:连接被拒绝

    在我的本地计算机上安装 hadoop 时 出现以下错误 ssh vvv localhost OpenSSH 5 5p1 OpenSSL 1 0 0e fips 6 Sep 2011 debug1 Reading configuration
  • 如何清除分享链接缓存?

    例如 我尝试分享一个链接http apps facebook com appname http apps facebook com appname 在我的个人资料页面上的 更新状态 下 我修改了应用程序的内容后 它仍然显示缓存 我尝试使用h
  • ((指针)(P)+1)^什么时候可以起作用?

    我正在研究delphiXE2 我正在研究PInteger 如果我在我的delphi代码中这样做 var P PInteger testInt Integer Scores array 0 4 of Integer 33 44 56 78 7
  • 使用 SSE2 优化 RGB565 到 RGB888 的转换

    我正在尝试使用 SSE2 和基本公式来优化从 565 到 888 的像素深度转换 col8 col5 lt lt 3 col5 gt gt 2 col8 col6 lt lt 2 col6 gt gt 4 我采用两个 2x565 128 位
  • 实现 gensim.LdaMallet 时出错

    我按照此链接上的说明进行操作 http radimrehurek com 2014 03 tutorial on mallet in python http radimrehurek com 2014 03 tutorial on mall
  • OpenCV 中二值图像的 width 和 widthStep 不同

    我使用 cvLoadImage 在 OpenCV 中加载二进制图像 如下所示 IplImage myImg cvLoadImage
  • Windows 上的 Xvfb

    我正在使用 pyvirtualdisplay 使用无头 Firefox 浏览器运行测试 这是我正在使用的代码 from selenium import webdriver from selenium webdriver support ui
  • VB6 的线程模型是什么?

    我正在将一个古老的 VB6 程序移植到 C Net 我不太了解VB6 我问这个是为了更好地理解它 旧的VB6程序有一个程序执行的主过程 但是它also有许多用于套接字事件或计时器事件的事件处理程序 以及这些经常操纵的共享资源 例如 公共全局
  • 如何在CSS中搜索某些内容时隐藏搜索图标

    我想隐藏search当用户搜索某些内容时的图标 连我都想躲起来 保留图标和清除图标x就这样 问题如下图所示 NOTE 我想保持相同的差距search icon and Search text input type search width
  • React:将组件存储在对象中

    我的用户配置文件中有几十个字段 我正在尝试构建一种有效的方法来在适当的输入表单组件中显示它们 例如 配置文件可能如下所示 profile1 name Cornelius Talmadge phone 1 如果我可以像这样堆叠组件 expor
  • 处理本地存储库中的旧快照的最佳方法?

    我们有一个 Nexus 本地存储库管理器 用于处理我们所有的内部项目 以及外部存储库的镜像 对于我们的内部项目 我们只保留最新版本的快照构建 例如 如果我们有 ProjectX 1 0 1 1 和 1 2 SNAPSHOT 那么一旦 1 2
  • 如何使用 OpenID Connect WebFinger 端点?

    正在阅读描述在这里 https connect2id com learn openid connect optional endpoints它说 WebFinger 允许根据给定用户的电子邮件地址或其他一些信息动态发现 OpenID Con
  • 在 Fortran 中分配字符数组

    我必须编写一个可以由 C 和 Fortran 调用的子例程 该子例程将文件名作为其参数之一 我知道为了与 C 良好地互操作 ISO C 绑定建议使用字符数组进行互操作 我的问题是 是否存在易于编写的字符数组文字之类的东西 我有一个这样的子程
  • 使用 Powershell 脚本开始调试 Visual Studio 项目

    我曾经在 Visual Studio 中打开解决方案文件 右键单击项目 选择 调试 gt 启动新实例 来启动调试会话 我可以编写一个 powershell 脚本来自动执行此操作吗 为了让事情变得更简单 自动化不必重建和项目 脚本只需要在 V
  • Grails:未刷新的会话和回滚的事务之间有什么区别?

    我对会话和交易感到非常困惑 我基本上不明白两者都有什么意义 而且我很困惑何时使用其中之一 未刷新的会话和未提交的事务有什么区别 我什至不知道如何询问我不知道的事情 是否有资源可以提供常见会话和事务情况的良好示例 以便我可以看到差异 一般来说
  • Docker 容器中 GUI 应用程序的 X11 转发

    我目前正在尝试在 docker 容器中运行一些 GUI 应用程序 我一直在尝试那些杰西 弗雷泽尔 https github com jessfraz at github https github com jessfraz dockerfil
  • 通过 ref 传递的引用类型和不通过 ref 传递的引用类型

    以不同方式调用 4 种方法时得到不同的结果 static void Main string args var emp new Employee Name ABC ChangeName1 emp Console WriteLine emp N
  • 如何在 Mongoid 中引用嵌入文档?

    使用 Mongoid 假设我有以下类 class Map include Mongoid Document embeds many locations end class Location include Mongoid Document
  • Bootstrap 导航栏覆盖缩放内容

    我正在为导航栏构建一个带有 navbar fixed top 类的网站 它在所有方面都工作正常 除了放大时 当我在移动设备上放大时 导航栏开始换行并在折叠后转到下一行 但是 我不希望导航栏在放大时受到影响 但同时保持对不同设备的响应能力 这
  • Spreadsheet.getNamedRanges() 不返回 DELETED 工作表中定义的 NamedRanges

    我有一个复杂的电子表格 其中每个选项卡都有许多在不同工作集中定义的命名范围 例如 Tab A Tab B Tab X 我试图将此电子表格分解为较小的独立电子表格 假设独立电子表格 1 只有 Tab A Tab B 方法是首先复制原始大型电子