未记录的 Sheet API 限制问题

2024-05-06

我已经看过人们遇到类似问题的帖子,但找不到明确的答案。

我尝试使用以下代码行检索 264735 个插槽的二维数组:

  var optionalArguments = {majorDimension: "ROWS",
                     valueRenderOption: "FORMULA",
  };
  var sourceValuesObject = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeA1Notation, optionalArguments)

但这是我得到的:

响应代码:413。消息:响应太大。

这看起来很奇怪,因为我看不到这种限制写在任何地方,加上如果 300000 个或更少的单元格导致 API 错误,用户如何获取大量数据。

我尝试过拆分请求并且它有效,但这使我的代码变得更加复杂和缓慢,而且在尝试将值更新回工作表范围时我得到空响应。

我指向正确的方向吗?这是正常的吗?有解决方法吗?

EDIT: 这是一个电子表格示例 https://docs.google.com/spreadsheets/d/1TiKFOlIvIhs5HaNN8uWfmzjgKb7K006fo2O3nLmfndU/edit#gid=1268242999

首先我尝试使用分割范围Sheets.Spreadsheets.Values.get里面一个for循环并且它起作用了。

做同样的事情batchGet给了我同样的错误,所以我猜单元格内的数据太大了。


这个解决方法怎么样?

实验:

此实验使用您共享的示例电子表格。

当 UrlFetchApp 直接调用 Sheets API 的端点时,如果响应大小大于 50 MB(52,428,800 Byte),则返回小于 50 MB 的响应。 50 MB 的大小是由于 UrlFetchApp 的限制。另一方面,在Advanced Google Service中,它无法确认这种情况,因为超过限制时就会发生错误。因此,通过使用 UrlFetchApp,可以确认您的情况的错误原因。所以首先,我使用以下脚本确认了这一点。

var spreadsheetId = "#####";
var range = "'Copie de Feuille 1'!A1:JE1000";
var url = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + range + "?majorDimension=ROWS&valueRenderOption=FORMULA";
var res = UrlFetchApp.fetch(url, {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}});
Logger.log(res.getContentText().length.toString())
var values = JSON.parse(res.getContentText());

当上面的脚本运行时,52428450被返回。并且在最后一行出现“未终止的字符串文字”错误。这意味着该对象是不完整的。从这个结果可以发现,一次调用values.get无法检索到范围为'Copie de Feuille 1'!A1:JE1000。这与以下情况相同我--我的评论 https://stackoverflow.com/questions/52900410/undocumented-sheet-api-limitation-problems?noredirect=1#comment92714210_52900410.

在您的示例电子表格中,发现错误发生的范围边界是'Copie de Feuille 1'!A1:JE722。当尝试从范围中检索值时'Copie de Feuille 1'!A1:JE723,出现错误。检索值的大小'Copie de Feuille 1'!A1:JE722是 52,390,229 字节。这小于 50 MB(52,428,800 字节)。尺寸从'Copie de Feuille 1'!A1:JE723是 52,428,450 字节,与以下值相同'Copie de Feuille 1'!A1:JE1000。由此发现超出了UrlFetchApp的限制。

解决方法:

为了避免此错误并检索所有值,作为一种解决方法,我认为我想建议它分割从电子表格检索值的范围。但在你的问题中,你想要速度。所以我想提出以下示例脚本。

  1. 创建请求。
  2. Fetch the created requests using UrlFetchApp.fetchAll().
    • By UrlFetchApp.fetchAll(),每个请求都可以通过异步处理来工作。
    • 在高级 Google 服务的 Sheets API 中,无法使用此功能。另外,在values.batchGet中,由于所有检索到的值都超出了限制,因此会发生错误。
    • 由此,使用的工艺成本UrlFetchApp.fetchAll()变得低于高级 Google 服务的 Sheets API。

示例脚本:

var ranges = ["'Copie de Feuille 1'!A1:JE500", "'Copie de Feuille 1'!A501:JE1000"]; // This was used from the shared spreadsheet. So please modify this for your environment.
var token = ScriptApp.getOAuthToken();
var requests = ranges.map(function(e) {
  return {
    method: "get",
    url: "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + e + "?majorDimension=ROWS&valueRenderOption=FORMULA",
    headers: {Authorization: "Bearer " + token},
    muteHttpExceptions: true,
  }
});
var res = UrlFetchApp.fetchAll(requests);
var values = res.reduce(function(ar, e) {
  Array.prototype.push.apply(ar, JSON.parse(e.getContentText()).values);
  return ar;
}, []);
Logger.log(values.length) // 1000
Logger.log(values[0].length) // 265

Note:

  • 如果您想使用该脚本,请确认在 API 控制台启用了 Sheets API。
  • 合并数组时,如果出现数组限制错误,请使用各个数组,不要合并数组。
  • 当使用高级Google服务的Sheets API时,在以下范围内也不会发生错误'Copie de Feuille 1'!A1:JE722错误发生在'Copie de Feuille 1'!A1:JE723。这个结果和下面的结果是一样的UrlFetchApp.

参考:

  • Google 服务配额 https://developers.google.com/apps-script/guides/services/quotas#current_limitations
  • 获取全部(请求) https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchAll(Object)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未记录的 Sheet API 限制问题 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐