【问题标题】:How to append CSV data with Google Sheets API and Python如何使用 Google Sheets API 和 Python 附加 CSV 数据
【发布时间】:2021-12-01 00:10:06
【问题描述】:

我目前正在学习 Python,并且正在尝试为客户创建 Google Sheets API 和 Python 的自动化代码。到目前为止,我的自动化代码已经成功地从网站下载了一个 csv 文件,找到了该文件,并将该文件推送到了 Google 表格。我使用了来自 this 问题的 Ufos 答案中的逻辑。问题是我重复这个过程大约 10 次,谷歌表格上的 csv 数据被新数据覆盖。我的客户希望在一个地方查看所有客户的数据。我试图做附加但不能让它与检索到的 csv 信息一起工作。我已经尽我所能使用谷歌,但我似乎无法让它工作。任何帮助将不胜感激!

 def insertIntoSheets(self, email, owner):
    creds = service_account.Credentials.from_service_account_file(
    self.SERVICE_ACCOUNT_FILE, scopes=self.SCOPES)

    service = build('sheets', 'v4', credentials=creds)
    
    # Insert CSV information into Google Sheet
    sheet = service.spreadsheets()
                        

    csv_path = ""
    csv_files = os.listdir(self.DOWNLOADS_PATH)
    for csv_file in csv_files:
        if csv_file.startswith("lead_export"):
            print("CSV path found")
            csv_path = os.path.join(self.DOWNLOADS_PATH, csv_file)
            print(f'CSV_PATH: {csv_path}')

    if csv_path == "":
        print("No CSV file detected. Must not have downloaded. Please try again.")
    else:
        #add email and owner
        values = (
            (owner, email),
        )
        value_range_body = {
            'majorDimension': 'ROWS',
            'values': values
        }
        service.spreadsheets().values().append(spreadsheetId=self.DATA_SPREADSHEET_ID, 
            valueInputOption='USER_ENTERED',
            range="Sheet1!A1",
            body=value_range_body).execute()

        #add CSV to Google Sheets
        print(f'Attempting to upload CSV file for {email}')
        with open(csv_path, 'r') as csv_file:
            csvContents = csv_file.read()
        body = {
            'requests': [
                   
                {
                'pasteData': {
                    "coordinate": {
                        "sheetId": [sheetId],
                        "rowIndex": "0",  # adapt this if you need different positioning
                        "columnIndex": "0", # adapt this if you need different positioning
                    },
                    "data": csvContents,
                    "type": 'PASTE_NORMAL',
                    "delimiter": ',',
                }
            }
            ]
        }
        request = sheet.batchUpdate(spreadsheetId=self.DATA_SPREADSHEET_ID, body=body)
        response = request.execute()

        print(f'Deleting CSV file for {email} account')
        deleted = self.removeCSV()
        if deleted == 0:
            print(f'No CSV files detected for {email}')
        else:
            print(f'{deleted} CSV files deleted for {email}.')

        return response

【问题讨论】:

  • 您能否更新您的代码,使其符合创建minimal reproducible example 的指南?
  • 我必须为我糟糕的英语水平道歉。关于The problem is that I repeat this process about 10 times the csv data on the Google Sheet gets overridden by the new data.,在这种情况下,当您重复您的过程少于 10 次时,工作表不会被新数据覆盖。我的理解正确吗?
  • @Tanaike 不用担心!不,这个函数是循环调用的,每次都会覆盖数据。在请求中,rowIndex 和 columnIndex 保持不变,因此数据总是在 Google 表格的开头抛出。我需要以某种方式附加数据。我见过很多附加到 Google 表格的示例,但它们不使用 csv 文件。他们通常有手动为行和列输入的数据。
  • 感谢您的回复。从您的回复中,我提出了一个修改点作为答案。你能确认一下吗?如果我误解了您的问题并且对您的情况没有帮助,我深表歉意。

标签: python google-sheets google-sheets-api


【解决方案1】:

我相信你的目标如下。

  • 您希望将文件中的 CSV 数据附加到 Google 电子表格中。
  • 您希望使用 googleapis for python 来实现这一点。
  • 您已经能够使用 Sheets API 为 Google 电子表格获取和输入值。

这样的话,下面的修改怎么样?

修改脚本:

请按如下方式修改您的脚本。

发件人:

with open(csv_path, 'r') as csv_file:
    csvContents = csv_file.read()
body = {
    'requests': [
           
        {
        'pasteData': {
            "coordinate": {
                "sheetId": [sheetId],
                "rowIndex": "0",  # adapt this if you need different positioning
                "columnIndex": "0", # adapt this if you need different positioning
            },
            "data": csvContents,
            "type": 'PASTE_NORMAL',
            "delimiter": ',',
        }
    }
    ]
}
request = sheet.batchUpdate(spreadsheetId=self.DATA_SPREADSHEET_ID, body=body)
response = request.execute()

收件人:

with open(csv_path, newline='') as f:
    reader = csv.reader(f)
    values = list(reader)
response = service.spreadsheets().values().append(spreadsheetId=spreadsheetId, valueInputOption='USER_ENTERED', range="Sheet1", body={"values": values}).execute()
  • 在此修改中,使用了import csv
  • 请根据您的实际情况修改"Sheet1"的工作表名称。
  • 在此修改中,CSV 数据作为列表从文件中检索,并使用电子表格.values.append 方法将列表作为附加值放入电子表格。

参考:

【讨论】:

  • 非常感谢!效果很好!
  • @RachGinger 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多