【问题标题】:How to get raw numbers from Google Sheets API如何从 Google Sheets API 获取原始数字
【发布时间】:2021-10-12 08:56:56
【问题描述】:

我有一个从谷歌表格获取数据的简单函数。

例如https://sheets.googleapis.com/v4/spreadsheets/{MYSHEET}/values/Sheet1!A1:D5

我在那里有一个长数字的字段,谷歌会自动以科学计数法显示,例如 1.234E+8。

我不介意它在表格中的显示方式,因为它从未直接使用过。但在我的 API 调用中,我必须能够获得原始/原始数字。

这是如何实现的?

PS。更改工作表 ui 中的格式可能会有所帮助,但这有两个问题:

  1. 这将需要对每个工作表中的每个字段进行双重和三重工作,而不是在获取数据的代码中进行修复。
  2. 我尝试使用它进行测试,但它似乎破坏了现有数据,因为它还更改了原始的“数据隐藏”。而不仅仅是显示值。所以我无论如何也不能走那条路。

更新

我发布了一个样本表。这是我用来下载的完整 URL:

https://sheets.googleapis.com/v4/spreadsheets/1pSQ4W0GV85Z-6QrUx0UxVA3VCSHE3x93BT3c-R6mHZk/values/Form Responses 1!A1:AZ1000?valueRenderOption=UNFORMATTED_VALUE

但是返回的json是错误的,如下:

{
  "range": "'Form Responses 1'!A1:F103",
  "majorDimension": "ROWS",
  "values": [
    [
      "cc"
    ],
    [
      4.3668413379866e+15
    ],
    [
      4.14809933325943e+15
    ]
  ]
}

【问题讨论】:

  • 虽然我不确定我是否能正确理解你的情况,但我提出了一个答案。你能确认一下吗?如果我误解了您的情况并且没有用处,我深表歉意。
  • 有什么想法吗?这对我来说非常重要。谢谢!

标签: google-sheets-api


【解决方案1】:

从您的端点来看,我认为您可能正在使用 Sheets API 中的电子表格.values.get 方法。如果我的理解是正确的,在您的情况下,使用valueRenderOption 的查询参数怎么样?当你的端点被修改后,变成如下。

修改端点:

https://sheets.googleapis.com/v4/spreadsheets/{MYSHEET}/values/Sheet1!A1:D5?valueRenderOption=UNFORMATTED_VALUE
  • 本次修改增加了valueRenderOption=UNFORMATTED_VALUE的查询参数。

参考:

补充:

当我看到您更新的问题时,您的值似乎是 16 位数字。在 Sheets API 中,可以将 15 位视为十进制数。当数字大于 15 位时,如1000000000000000,则检索1e+15 的值。当我使用电子表格.values.get 、电子表格.values.batchGet 和电子表格.get 的方法对此进行测试时,得到了相同的结果。当我看到您的电子表格时,4.3668413379866e+154.14809933325943e+15 被检索到。

幸运的是,当我使用 Google Apps Script 的电子表格服务对此进行测试时,我注意到可以检索到 43668413379866004148099333259430 的值。因此,作为一种解决方法,我想提出以下流程。

用法:

1。创建一个新的 Google Apps 脚本项目。

Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。

如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。这样,Google Apps Script 的脚本编辑器就打开了。

2。示例脚本。

请将以下脚本复制并粘贴到创建的 Google Apps 脚本项目中并保存。此脚本用于 Web 应用程序。

function doGet(e) {
  const {id, range} = e.parameter;
  if (!id || !range) return ContentService.createTextOutput("No spreadsheet ID or range.");
  const values = SpreadsheetApp.openById(id).getRange(range).getValues();
  return ContentService.createTextOutput(JSON.stringify(values));
}

3。部署 Web 应用程序。

详细信息可见the official document

  1. 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
  2. 请点击“选择类型”->“Web App”。
  3. 请在“部署配置”下的字段中输入有关Web App的信息。
  4. 请为“执行为”选择“我”
    • 这是此解决方法的重要性。
  5. 请为“谁有权”选择“任何人”
    • 在这种情况下,用户不需要使用访问令牌。所以请将此作为测试用例。
    • 当然,您也可以使用访问令牌访问您的 Web 应用程序。请查看this report
  6. 请点击“部署”按钮。
  7. 复制 Web 应用程序的 URL。就像https://script.google.com/macros/s/###/exec

4。测试。

为了测试此 Web 应用程序,请通过将其替换为您的 Web 应用程序 URL 来访问以下端点。

https://script.google.com/macros/s/###/exec?id=1pSQ4W0GV85Z-6QrUx0UxVA3VCSHE3x93BT3c-R6mHZk&range=Form%20Responses%201!A2:A3

当浏览器访问这个端点时,得到如下结果。

[
  [4366841337986600],
  [4148099333259430]
]

注意:

  • 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在 Web Apps 中。请注意这一点。
  • 您可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中查看详细信息。
  • 我提议的脚本是一个简单的脚本。所以请根据您的实际情况进行修改。

参考资料:

【讨论】:

  • 嗨。非常感谢。不幸的是,这似乎没有什么不同。还有其他想法吗?
  • 请查看我现在发布的样本表和网址。再次感谢。
  • @Yisroel M. Olewski 感谢您的回复。我带来的不便表示歉意。根据您更新的问题,我提出了一种解决方法来实现您的目标。你能确认一下吗?如果这不是您期望的方向,我深表歉意。
  • 哦,天哪!哇!我不相信!你为我付出了很多时间和精力。我感觉如此糟糕。对不起,我不认为我想走那条路。好像有点矫枉过正。我想试试看我能不能得到一个更好的主意。但我非常感谢你为写下这一切所做的辛勤工作。我很感激!上帝保佑你!
  • @Yisroel M. Olewski 感谢您的回复。我深表歉意,我提出的答案对您的情况没有用处。这是因为我的技术不好。我想学习更多。但是,我认为我的回答中的这种方法可能对其他用户有用。所以我想留下我的答案。如果你能允许留下我的答案,我很高兴。
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多