首页 > 解决方案 > 使用 Google Sheets API,当我输入数据时,不支持添加和更新列格式

问题描述

所以,这真的是一个基于我上次尝试的后续问题

如何使用 API 将列添加到 Google 表格并在同一调用中提供列的名称和类型?

所以,我想使用batchUpdate命令在单个API 调用 中执行以下操作

我构建了我的 API 调用并按以下方式执行

curl -v \
-H 'Authorization: Bearer ya29.GlxUB-UnpiYLeMzdAYyz_kVvNIVwmlMvxauAfiklslphd60INbgOQEr2eUwdx4smOSirde63hW2CvR17AMfj1P5iGw1Q3dRgGBHGZ92JKoFWozSxjbJh0wEZJKvDUQ' \
-H 'Content-Type: application/json' \
-d '{
      "requests": [
        {
          "insertDimension": {
            "range": {
              "sheetId": 2052094881,
              "dimension": "COLUMNS",
              "startIndex": 0,
              "endIndex": 1
            }
          }
        },
        {
          "repeatCell": {
            "range": {
              "sheetId": 2052094881,
              "startRowIndex": 0,
              "endRowIndex": 1,
              "startColumnIndex": 0,
              "endColumnIndex": 1
            },
            "cell": {
              "userEnteredValue": {
                "stringValue": "discretionary"
              }
            },
            "fields": "userEnteredValue.stringValue"
          }
        },{
          "repeatCell": {
            "range": {
              "sheetId": 2052094881,
              "startRowIndex": 1,
              "startColumnIndex": 1,
            },
            "cell": {
              "userEnteredFormat": {
                "numberFormat": {
                    "type": "DATE_TIME",
                    "pattern": "dddd, m/d/yy at h:mm"
                }
              }
            },
            "fields": "userEnteredFormat.numberFormat"
          }
        },
      ],
    }' \
https://sheets.googleapis.com/v4/spreadsheets/1mHrPXQILuprO4NdqTgrVKlGazvvzgCFqIphGdsmptD8:batchUpdate

这似乎工作正常,因为我可以在索引处看到一个新列,0并且AAPI 响应也很好

< HTTP/2 200
< content-type: application/json; charset=UTF-8
< vary: X-Origin
< vary: Referer
< vary: Origin,Accept-Encoding
< date: Mon, 29 Jul 2019 20:09:29 GMT
< server: ESF
< cache-control: private
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< alt-svc: quic=":443"; ma=2592000; v="46,43,39"
< accept-ranges: none
<
{
  "spreadsheetId": "1mHrPXQILuprO4NdqTgrVKlGazvvzgCFqIphGdsmptD8",
  "replies": [
    {},
    {},
    {}
  ]
}
* Connection #0 to host sheets.googleapis.com left intact

因此,我想验证如果现在我将任何值放入此列(从 开始A2),格式dddd, m/d/yy at h:mm将被应用。所以我插入了一个类似于以下命令的值

curl -v \
-H 'Authorization: Bearer ya29.GlxUB3ad1mGpbFBT1raZx2C76kmiSPBDX6_epAWNd3hwWC7EMtzgVBPB34JAK543N7g2Y1cYeFc_VWjTpmeU7LSE4nDGiyCUafqhqPTJHUg5UmrfjVxH5pcmeJXK4Q' \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "valueInputOption": "USER_ENTERED",
  "data": [
    {
      "range": "Sheet1!A2:A3",
      "majorDimension": "COLUMNS",
      "values": [
        ["7/29/2019 12:56:31"]
      ]
    }
  ]
}' \
https://sheets.googleapis.com/v4/spreadsheets/1mHrPXQILuprO4NdqTgrVKlGazvvzgCFqIphGdsmptD8/values:batchUpdate

当我执行时,响应似乎很好

< HTTP/2 200
< content-type: application/json; charset=UTF-8
< vary: X-Origin
< vary: Referer
< vary: Origin,Accept-Encoding
< date: Mon, 29 Jul 2019 20:09:58 GMT
< server: ESF
< cache-control: private
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< alt-svc: quic=":443"; ma=2592000; v="46,43,39"
< accept-ranges: none
<
{
  "spreadsheetId": "1mHrPXQILuprO4NdqTgrVKlGazvvzgCFqIphGdsmptD8",
  "totalUpdatedRows": 1,
  "totalUpdatedColumns": 1,
  "totalUpdatedCells": 1,
  "totalUpdatedSheets": 1,
  "responses": [
    {
      "spreadsheetId": "1mHrPXQILuprO4NdqTgrVKlGazvvzgCFqIphGdsmptD8",
      "updatedRange": "Sheet1!A2",
      "updatedRows": 1,
      "updatedColumns": 1,
      "updatedCells": 1
    }
  ]
}

但是,当我从浏览器查看工作表时,文字值7/29/2019 12:56:31是可用的。我发现这不正确,因为我预计格式dddd, m/d/yy at h:mm已应用

在此处输入图像描述

我正在寻找以下问题的答案
- 首先,我在这里做错了什么?- 我该如何解决这个问题?
- 使用浏览器视图查看列时如何知道列的格式?

非常感谢您阅读到这里!

标签: apicurlgoogle-sheetsgoogle-sheets-api

解决方案


  • 您想知道为什么使用“values:batchUpdate”方法放置的值没有格式化。
  • 您想了解修改格式的方法。
    • 您想在浏览器视图中看到上面的内容。

如果我的理解是正确的,这个答案怎么样?

问题 1 的答案:

我认为在您的问题 1 中,有 2 个问题。

问题一:

从您的第一个 curl 命令中,我认为 gridrange 的索引不正确。在您的问题中,您正在尝试进行以下更新。

  1. 您想在“A”列的左侧插入一个新列。
  2. 您想为discretionary插入列的第 1 行设置一个值(在这种情况下,它是“A”列)。
  3. 您想为插入的列设置dddd, m/d/yy at h:mmas的数字格式。DATE_TIME

在这种情况下,在 curl 命令的 3 个请求中,第一个和第二个请求是正确的。但是第三个请求有问题。第三个请求的请求体如下。

{
  "repeatCell": {
    "range": {
      "sheetId": 2052094881,
      "startRowIndex": 1,
      "startColumnIndex": 1   <--- here
    },
    "cell": {
      "userEnteredFormat": {
        "numberFormat": {
          "type": "DATE_TIME",
          "pattern": "dddd, m/d/yy at h:mm"
        }
      }
    },
    "fields": "userEnteredFormat.numberFormat"
  }
}

11分别用于startRowIndexstartColumnIndex。这意味着来自单元格“B1”的所有单元格。这样,放入“A2:A3”的值将values:batchUpdate被放入单元格而不进行格式化。这是第一个问题的原因。

第一个问题的解决方案:

作为解决方案,请使用10分别用于startRowIndexstartColumnIndex。通过这种方式,格式反映到“A”列。

问题 2:

7/29/2019 12:56:31由values:batchUpdate放时,格式似乎被覆盖了。这样,上面设置的格式就不能反映了。此外,电子表格的日期和时间由序列号管理。这些是第二个问题的原因。

第二题的解决方法:

作为解决方案,请使用序列号。当7/29/2019 12:56:31转换为序列号时,它变为43675.54。当它用于您的以下 curl 命令时,它变为如下。

修改 curl 命令:
curl \
-H 'Authorization: Bearer ###' \
-H 'Content-Type: application/json' \
-X POST \
-d '{"valueInputOption":"USER_ENTERED","data":[{"range":"Sheet1!A2:A3","majorDimension":"COLUMNS","values":[[43675.54]]}]}' \
https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values:batchUpdate
  • 请将 的值设置43675.54为数字。所以请不要用双引号和单引号括起来。由此,43675.54用作带有 的数字USER_ENTERED
  • 在这种情况下,当运行此 curl 命令时,您可以看到格式化的值已放入浏览器的单元格中。

问题 2 的答案:

我认为问题1的答案也可以回答问题2的答案。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读