从现有的 Google 电子表格中获取响应、追加行和更新

我可以连接到 Google 电子表格并添加新行(列表中的实际值),如下所示,它可以工作:


import gspread

from oauth2client.service_account import ServiceAccountCredentials


from pprint import pprint

from googleapiclient import discovery


scope = ['https://spreadsheets.google.com/feeds',

    'https://www.googleapis.com/auth/drive',

    'https://www.googleapis.com/auth/spreadsheets.currentonly',

    'https://www.googleapis.com/auth/spreadsheets']

credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)

gc = gspread.authorize(credentials)


service = discovery.build('sheets', 'v4', credentials=credentials)


#Name of Spreadsheet

Sheet_Title = "New Spreadsheet Final"


# The ID of the spreadsheet 

spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'  # TODO: Update placeholder value.

#Get sheet ID


#Open the wanted Tab

sheet = gc.open(Sheet_Title).worksheet("Tab One")  


#Get the wanted range of the sheet

range_name = 'A1:W1000'  # TODO: Update placeholder value.


#Add new rows in the Sheet. Values are hardcoded below

values = [

    ['09/01/2021', 'IT', '8%'],

    ['08/02/2021', 'NL', '1%']

    # Additional rows ...

]

body = {

    'values': values

}


#Append the rows in the Google Spreadsheet

result = service.spreadsheets().values().append(

    spreadsheetId=spreadsheet_id, range=range_name,

    valueInputOption='USER_ENTERED', body=body).execute()


我现在要做的是添加新行,但为每个单元格(或通常特定的列)添加数据验证。所以,我下去检查了响应。然后我附加了一个新的行值,其中包括格式和数据验证:


#Values to be added in the original query

value_to_be_added = [

              {

                "formattedValue": "05/05/2019",

                "userEnteredFormat": {

                  "numberFormat": {

                    "type": "DATE",

                    "pattern": "dd/mm/yyyy"

                  }

                },

                "dataValidation": {

                  "condition": {

                    "type": "DATE_IS_VALID"

                  },

                  "strict": "True"

                }

              },


有没有办法用更新的响应完全更新/替换原始响应?


临摹微笑
浏览 156回答 2
2回答

牧羊人nacy

您想将一行追加到电子表格最后一行的下一行。您想附加一行,如日期值dd/mm/yyyy、数据验证、0%格式数和数字。您想将 的值05/05/2019, UK, 8%, 9作为显示值。您想使用 gspread 和 python 来实现这一点。您已经能够使用 Sheets API 获取和放置电子表格的值。如果我的理解是正确的,那么这个示例脚本怎么样?在这个示例脚本中,我使用了batch_updategspread 的方法。gspread 的方法batch_upate是 Sheets API 的电子表格.batchUpdate 方法。该行由 appendCells 请求附加。示例脚本:示例脚本如下。在运行脚本之前,请设置电子表格 ID 和工作表名称。在此脚本中,Tab One用作工作表名称。gc = gspread.authorize(credentials)spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'sheetName = "Tab One"spreadsheet = gc.open_by_key(spreadsheet_id)sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']body = {'requests':        [            {                'appendCells':                {                    'rows':                    [                        {                            'values':                            [                                {                                    'userEnteredFormat':                                    {                                        'numberFormat':                                        {                                            'type': 'DATE',                                            'pattern': 'dd/mm/yyyy'                                        }                                    },                                    'dataValidation':                                    {                                        'condition':                                        {                                            'type': 'DATE_IS_VALID'                                        },                                        'strict': True                                    },                                    'userEnteredValue':                                    {                                        'numberValue': 43590  # This is the serial number of "05/05/2019".                                    }                                },                                {                                    'userEnteredFormat':                                    {                                        'numberFormat':                                        {                                            'type': 'NUMBER',                                            'pattern': '#,##0.00'                                        },                                        'verticalAlignment': 'BOTTOM'                                    },                                    'dataValidation':                                    {                                        'condition':                                        {                                            'type': 'ONE_OF_LIST',                                            'values':                                            [                                                {                                                    'userEnteredValue': 'UK'                                                },                                                {                                                    'userEnteredValue': 'ES'                                                },                                                {                                                    'userEnteredValue': 'IT'                                                },                                                {                                                    'userEnteredValue': 'DE'                                                },                                                {                                                    'userEnteredValue': 'AT'                                                },                                                {                                                    'userEnteredValue': 'NL'                                                }                                            ]                                        },                                        'showCustomUi': True                                    },                                    'userEnteredValue':                                    {                                        'stringValue': 'UK'                                    }                                },                                {                                    'userEnteredFormat':                                    {                                        'numberFormat':                                        {                                            'type': 'PERCENT',                                            'pattern': '0%'                                        }                                    },                                    'userEnteredValue':                                    {                                        'numberValue': 0.08                                    }                                },                                {                                    'userEnteredValue':                                    {                                        'numberValue': 9                                    }                                }                            ]                        }                    ],                    'sheetId': sheetId,                    'fields': '*'                }            }        ]        }res = spreadsheet.batch_update(body)print(res)笔记:当05/05/2019作为格式的日期输入时dd/mm/yyyy,请输入编号为43590序号。添加:当你想在for循环中使用请求体时,下面的脚本怎么样?batchUpdate 方法可以与数组一起使用。gc = gspread.authorize(credentials)spreadsheet_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'sheetName = "Tab One"spreadsheet = gc.open_by_key(spreadsheet_id)sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']requests = []for x in range(len(new_values)):  # Please set "new_values".    body =                 {                    'appendCells':                    {                        'rows':                        [                            {                                'values':                                [                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'DATE',                                                'pattern': 'dd/mm/yyyy'                                            }                                        },                                        'dataValidation':                                        {                                            'condition':                                            {                                                'type': 'DATE_IS_VALID'                                            },                                            'strict': True                                        },                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][0]                                        }                                    },                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'NUMBER',                                                'pattern': '#,##0.00'                                            },                                            'verticalAlignment': 'BOTTOM'                                        },                                        'dataValidation':                                        {                                            'condition':                                            {                                                'type': 'ONE_OF_LIST',                                                'values':                                                [                                                    {                                                        'userEnteredValue': 'UK'                                                    },                                                    {                                                        'userEnteredValue': 'ES'                                                    },                                                    {                                                        'userEnteredValue': 'IT'                                                    },                                                    {                                                        'userEnteredValue': 'DE'                                                    },                                                    {                                                        'userEnteredValue': 'AT'                                                    },                                                    {                                                        'userEnteredValue': 'NL'                                                    }                                                ]                                            },                                            'showCustomUi': True                                        },                                        'userEnteredValue':                                        {                                            'stringValue': new_values[x][1]                                        }                                    },                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'PERCENT',                                                'pattern': '0%'                                            }                                        },                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][2]                                        }                                    },                                    {                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][2]                                        }                                    }                                ]                            }                        ],                        'sheetId': sheetId,                        'fields': '*'                    }                }    requests.append(body)res = spreadsheet.batch_update({'requests':requests})print(res)

慕尼黑的夜晚无繁华

我的版本基于 Tanaike 的回答:#List of rows with valuesnew_values = [[43590,'UK',0.08,9],[43590,'DE',0.07,8]]#connect to the google sheet and tabsheetName = "Tab One"spreadsheet = gc.open_by_key(spreadsheet_id)sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']#Add each value/rowfor x in range(len(new_values)):    #print(new_values[x])    body = {'requests':            [                {                    'appendCells':                    {                        'rows':                        [                            {                                'values':                                [                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'DATE',                                                'pattern': 'dd/mm/yyyy'                                            }                                        },                                        'dataValidation':                                        {                                            'condition':                                            {                                                'type': 'DATE_IS_VALID'                                            },                                            'strict': True                                        },                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][0]  # This is the serial number of "05/05/2019".                                        }                                    },                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'NUMBER',                                                'pattern': '#,##0.00'                                            },                                            'verticalAlignment': 'BOTTOM'                                        },                                        'dataValidation':                                        {                                            'condition':                                            {                                                'type': 'ONE_OF_LIST',                                                'values':                                                [                                                    {                                                        'userEnteredValue': 'UK'                                                    },                                                    {                                                        'userEnteredValue': 'ES'                                                    },                                                    {                                                        'userEnteredValue': 'IT'                                                    },                                                    {                                                        'userEnteredValue': 'DE'                                                    },                                                    {                                                        'userEnteredValue': 'AT'                                                    },                                                    {                                                        'userEnteredValue': 'NL'                                                    }                                                ]                                            },                                            'showCustomUi': True                                        },                                        'userEnteredValue':                                        {                                            'stringValue': new_values[x][1]                                        }                                    },                                    {                                        'userEnteredFormat':                                        {                                            'numberFormat':                                            {                                                'type': 'PERCENT',                                                'pattern': '0%'                                            }                                        },                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][2]                                        }                                    },                                    {                                        'userEnteredValue':                                        {                                            'numberValue': new_values[x][3]                                        }                                    }                                ]                            }                        ],                        'sheetId': sheetId,                        'fields': '*'                    }                }            ]            }    res = spreadsheet.batch_update(body)身体在每个循环中都被拉动。如果您认为这不是最好的方法(循环身体),您可以评论任何替代方案。有一个循环并将values数组附加到 body 对象中可能更容易。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python