当前位置: 首页 > 知识库问答 >
问题:

尝试使用google sheets的电子表格()时收到“无效的JSON有效负载”。batchUpdate()

松正阳
2023-03-14

我正在编写一个python脚本,它首先在GoogleSheets中创建一个工作表,然后将CSV上传到其中,然后从工作表中生成幻灯片表格。我正在使用sheets API,我可以成功地创建一个新的工作表。然而,当尝试将CSV上传到其中时,我得到一个“无效JSON负载”错误,表示找不到PasteDataRequest。我直接从docs PasteDataRequest docs和batchUpdate docs中获取它

这就是脚本的样子

from __future__ import print_function
from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
from datetime import datetime

SCOPES = (
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/presentations',
)
store = file.Storage('.//script//storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('.//script//credentials.json', SCOPES)
    creds = tools.run_flow(flow, store)
HTTP = creds.authorize(Http())
SHEETS = discovery.build('sheets', 'v4', http=HTTP)
SLIDES = discovery.build('slides', 'v1', http=HTTP)

print('Creating Sheet')
csvInInbox = './/Inbox//Report.csv'
reportSheet = {
    'properties': {
        'title': 'CRM results report - ' + str(datetime.now())
    }
}
sheetsRsp = SHEETS.spreadsheets().create(body=reportSheet,fields='spreadsheetId').execute()
sheetId = sheetsRsp.get('spreadsheetId')
print('DONE\nSpreadsheet ID: {0}'.format(sheetsRsp.get('spreadsheetId')))

print('\nUploading CSV into sheet ' + sheetId)

sheetReq = [{'PasteDataRequest': {
        'coordinate': {
        'sheetId': sheetId,
        'rowIndex': 0,
        'columnIndex': 0
      },
      'data': csvInInbox,
      'type': "enum" "(PASTE_NORMAL)",
      'delimiter': ",",
    }
}]
sheetsRsp = SHEETS.spreadsheets().batchUpdate(body = {'requests': sheetReq},spreadsheetId=sheetId).execute()
print("DONE\n")

根据文件,这似乎是正确的要求。谁能告诉我我做错了什么?这是我第一次使用API,所以我可能忘了什么。

错误消息:

"Invalid JSON payload received. Unknown name "PasteDataRequest" at 'requests[0]': Cannot find field."

共有1个答案

王曜文
2023-03-14

我相信你的目标如下。

  • 你想创建新的谷歌电子表格,并把值放在第一个选项卡。
  • 你想使用googleapis和Python来实现这一点。
  • 您已经能够使用工作表API获取和放置电子表格的值。

对于这个问题,这个答案如何?

>

  • csvInbox='。//Inbox//Report.csv'不能直接用于请求主体,如'data': csvInbox。要求读取文件内容。

    sheetId=sheetsRsp的sheetId。get('spreadsheetId')是电子表格ID。因此,当使用它时,会发生错误。在您的情况下,新电子表格中第一个选项卡的工作表ID为0。所以你可以用这个。

    您的请求正文需要修改。请修改如下。

    >

  •   sheetReq = [{'PasteDataRequest': {
              'coordinate': {
              'sheetId': sheetId,
              'rowIndex': 0,
              'columnIndex': 0
            },
            'data': csvInInbox,
            'type': "enum" "(PASTE_NORMAL)",
            'delimiter': ",",
          }
      }]
    

      sheetReq = [{
          "pasteData": {
              "coordinate": {
                  "sheetId": 0,
                  "rowIndex": 0,
                  "columnIndex": 0
              },
              "data": csvInInbox,
              "type": "PASTE_NORMAL",
              "delimiter": ","
          }
      }]
    

    当上述各点反映到脚本中时,它将变成如下所示。

    print('Creating Sheet')
    csvInInbox = './/Inbox//Report.csv'
    reportSheet = {
        'properties': {
            'title': 'CRM results report - ' + str(datetime.now())
        }
    }
    sheetsRsp = SHEETS.spreadsheets().create(body=reportSheet,fields='spreadsheetId').execute()
    sheetId = sheetsRsp.get('spreadsheetId')
    print('DONE\nSpreadsheet ID: {0}'.format(sheetsRsp.get('spreadsheetId')))
    
    print('\nUploading CSV into sheet ' + sheetId)
    
    sheetReq = [{'PasteDataRequest': {
            'coordinate': {
            'sheetId': sheetId,
            'rowIndex': 0,
            'columnIndex': 0
          },
          'data': csvInInbox,
          'type': "enum" "(PASTE_NORMAL)",
          'delimiter': ",",
        }
    }]
    sheetsRsp = SHEETS.spreadsheets().batchUpdate(body = {'requests': sheetReq},spreadsheetId=sheetId).execute()
    print("DONE\n")
    
    print('Creating Sheet')
    csvInInbox = './/Inbox//Report.csv'
    with open(csvInInbox) as f:
        csvInInbox = f.read()
    reportSheet = {
        'properties': {
            'title': 'CRM results report - ' + str(datetime.now())
        }
    }
    sheetsRsp = SHEETS.spreadsheets().create(body=reportSheet, fields='spreadsheetId').execute()
    sheetId = sheetsRsp.get('spreadsheetId')
    print('DONE\nSpreadsheet ID: {0}'.format(sheetsRsp.get('spreadsheetId')))
    print('\nUploading CSV into sheet ' + sheetId)
    sheetReq = [{
        "pasteData": {
            "coordinate": {
                "sheetId": 0,
                "rowIndex": 0,
                "columnIndex": 0
            },
            "data": csvInInbox,
            "type": "PASTE_NORMAL",
            "delimiter": ","
        }
    }]
    sheetsRsp = SHEETS.spreadsheets().batchUpdate(body={'requests': sheetReq}, spreadsheetId=sheetId).execute()
    print("DONE\n")
    
    • 请检查是否csvInbox='的文件。//Inbox//Report.csv'再次存在。
    • 方法:电子表格。批量更新
    • 粘贴数据请求

  •  类似资料:
    • 我刚开始使用Sheets API,并按照以下设置创建新的工作表:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create 在此代码中,spreadsheetBody对象为空。为此,我使用了本页上的示例:https://developers.google.com/sheets/api/samples/

    • 所以我现在正在开发一个PWA。 我现在正在处理推送通知,并且已经能够通过以下非常简单的JSON结构接收后台和前台通知。 最后,我尝试在setBackgroundMessageHandler中硬编码图标和click_action,但没有成功。如果不显示图标,则单击通知时不会发生任何情况。 这纯粹是一个Ionic PWA项目,意在移动浏览器和桌面上运行。我会很感激你给我的每一个小费!谢谢!

    • 我试图将一个报告从Google Ads API拉到Google sheets中,但我无法让API将我的查询识别为查询

    • 问题内容: 我正在构建JSON对象,并使用JQuery ajax将其传递到服务器。 但是,当我的blogBody变量包含代码时,将失败并显示错误消息: 有人可以说错误在哪里以及如何解决? 问题答案: 在JSON中,键必须用双引号()而不是单引号()引起。同样,字符串值必须用双引号而不是单引号引起来。您正在使用单引号。例如,标题文字前后。 因此,至少,您需要交换这些引号,例如:

    • 如果我创建一个JWT令牌,有效负载中应该有哪些数据?我在网上查找了一些示例和解释,有些人将密码放在JWT中,有些人没有。 现在我正在传递以下数据: 将散列密码放入JWT有效负载感觉不对,因为JWT将被放置在前端应用程序中。它应该在那里吗? 最佳实践是什么?

    • 问题内容: 我正在尝试从Web服务器读取.json文件。 我从服务器接收到的JSON在http://jsonlint.com/上报告无效: 它显示以下测试结果: 在使用PHP解析之前,如何将其转换为VALID JSON? 问题答案: 所有键(preOpen,preClose等)都必须是字符串,因此它们需要用双引号引起来。 ===更新=== 如果您的Json-String无效,则可以使用以下脚本对其