Modifier la feuille de calcul Google avec Python (cas RPA à faible coût avec API Google et Python)

introduction

À quelle fréquence avez-vous l'occasion de travailler avec des logiciels de création de graphiques tels que SpreadSheet et Excel? On s'attend à ce que de nombreuses personnes consacrent beaucoup de temps à leur travail.

Si vous pouvez manipuler des données de graphique qui prennent beaucoup de temps avec Python et automatiser le travail de routine, cela conduira sûrement à une efficacité opérationnelle. Maintenant, travaillons avec SpreadSheet dans le populaire Python.

Aperçu

Dans cet article, nous publierons une classe Python pour «lire / écrire / effacer / modifier le format» pour SpreadSheet dans Google Drive.

Il existe déjà une bibliothèque Python pratique appelée gspread dans les rues, mais essayons-la pour les raisons suivantes.

Cette fois, je vais présenter un exemple de définition d'une classe, de son instanciation et de son utilisation. Vous pouvez modifier plusieurs feuilles de calcul en même temps en instanciant, alors essayez-le. De plus, Class n'est qu'un exemple, donc si vous êtes intéressé, veuillez le personnaliser vous-même.

supposition

procédure

** 1. Préparez la feuille de calcul suivante ** Cette fois, j'ai préparé des feuilles avec des valeurs entrées dans les colonnes A à E et les lignes 1 à 10. (Le nom de la feuille de travail est «échantillon») スクリーンショット 2020-03-01 22.51.46.png

** 2. Créez un ipynb dans Jupyter Notebook et copiez et exécutez la classe suivante dans l'étape **

<détails>

Afficher le code </ summary>

import re
import time
import json
import copy
import pickle
import os.path

from pprint import pprint
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request


class SpreadSheetsApi:

    def __init__(self,SPREADSHEET_ID,RANGE_NAME):
        self.service = self.launch_api()
        self.values = self.read_sheet(SPREADSHEET_ID,RANGE_NAME)

    def launch_api(self):
        SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

        creds = None
        if os.path.exists('spreadsheet_token.pickle'):
            with open('spreadsheet_token.pickle', 'rb') as token:
                creds = pickle.load(token)
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'credentials.json', SCOPES)
                creds = flow.run_local_server(port=0)
            with open('spreadsheet_token.pickle', 'wb') as token:
                pickle.dump(creds, token)

        service = build('sheets', 'v4', credentials=creds)
        
        return service

    def read_sheet(self,SPREADSHEET_ID,RANGE_NAME):
        # Call the Sheets API
        sheet = self.service.spreadsheets()
        result = sheet.values().get(spreadsheetId=SPREADSHEET_ID, range=RANGE_NAME).execute()
        self.values = result.get('values', [])
        
        return self.values
        
    def write_values(self,SPREADSHEET_ID,RANGE_NAME,value_list):
        # Call the Sheets API(Overwrite Sheets)

        ValueInputOption = 'RAW'
        body = {
            'values': value_list,
        }
        result = self.service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID, range=RANGE_NAME,valueInputOption=ValueInputOption, body=body).execute()
        self.values = self.read_sheet(SPREADSHEET_ID,RANGE_NAME)
        
    def clear_contents(self, SPREADSHEET_ID, sheet_num,start_row):
        # Call the Sheets API(Append Texts)

        ValueInputOption = 'USER_ENTERED'

        requests = []

        requests.append({
                "updateCells": {
                "range": {
                    "sheetId": sheet_num,
                    "startRowIndex": start_row
                },
                "fields": "userEnteredValue"
                }
            })

        body = { 'requests': requests }

        response = self.service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=body).execute()
        self.values = self.read_sheet(SPREADSHEET_ID,RANGE_NAME)
    


    def change_format(self,SPREADSHEET_ID,sheet_num,value_list):
        # Call the Sheets API(Append Texts)
        ValueInputOption = 'USER_ENTERED'

        requests = []


        requests.append({
            "repeatCell": {
                "range": {
                    "sheetId": sheet_num,
                    "startRowIndex": 0,
                    "endRowIndex": 1,
                    "startColumnIndex": 0,
                    "endColumnIndex": len(value_list[0]),
                    },
                "cell": {
                    "userEnteredFormat": {
                        "horizontalAlignment" : "CENTER",
                        "textFormat": {
                            "fontSize": 18,
                            "bold": True,
                            }
                        }
                    },
                "fields": "userEnteredFormat(textFormat,horizontalAlignment)"
                },
            })

        requests.append({
            "updateBorders": {
                "range": {
                "sheetId":sheet_num,
                "startRowIndex": 0,
                "endRowIndex": len(value_list),
                "startColumnIndex": 0,
                "endColumnIndex": len(value_list[0])
                },
                "top": {
                "style": "SOLID",
                "width": 1,
                },
                "bottom": {
                "style": "SOLID",
                "width": 1,
                },
                "right": {
                "style": "SOLID",
                "width": 1,
                },
                "right": {
                "style": "SOLID",
                "width": 1,
                },
                "innerHorizontal": {
                "style": "SOLID",
                "width": 1
                },
                "innerVertical": {
                "style": "SOLID",
                "width": 1
                },
            }
            }
        )

        requests.append({
            "autoResizeDimensions": {
                "dimensions": {
                "dimension": "COLUMNS",
                "startIndex": 0,
                "endIndex": len(value_list[0])
                }
            }
            })


        body = { 'requests': requests }

        response = self.service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=body).execute()

** 3. En vous basant sur la classe définie, créez une instance avec l'ID de feuille de calcul (str) dans 1. ci-dessus comme argument **

  • L'ID de la feuille de calcul est écrit en caractères alphanumériques juste avant "/ edit" dans l'URL de la feuille de calcul.
spreadsheet_id ='XXXXXXXXXXX' #ID de feuille de calcul défini comme une chaîne
range_name ="sample" #Définissez le nom de la feuille de calcul que vous souhaitez extraire
test_ss = SpreadSheetsApi(SPREADSHEET_ID = spreadsheet_id, RANGE_NAME = range_name) #Tableur/Créer une instance pour extraire les valeurs de la feuille de calcul

Dès que vous créez cette instance, les valeurs de la feuille cible seront extraites de la feuille de calcul.

** 4. Convertissez la liste Python en Pandas Dataframe et vérifiez la valeur de lecture ** En même temps que la création de cette instance, la liste des éléments (titre / corps / tableau, etc.) de toutes les feuilles sera extraite de SpreadSheet. Dans cet exemple, les valeurs extraites sont stockées dans test_ss.values.

import pandas as pd
#Convertir une table de valeurs en Pandas Dataframe
df = pd.DataFrame(test_ss.values,columns=['A','B','C','D','E'])
df.index = df.index + 1
スクリーンショット 2020-03-01 22.58.30.png Il a le même contenu que la feuille de calcul.

** 5. Réécrivez la feuille de calcul avec les valeurs suivantes en utilisant la méthode ** Je voudrais refléter l'exemple_valeur ci-dessous dans ce tableau.

example_value = [["A1","B1"],["A2","B2"]] #Valeur à réécrire
test_ss.write_values(SPREADSHEET_ID = spreadsheet_id, RANGE_NAME = range_name,value_list =example_value) #Méthode de réécriture

Dans l'API Sheets, une matrice de feuille est représentée par une liste multiple à deux couches. L'ordre de la liste dans la première couche montre la ligne de la feuille, et l'ordre de la liste dans la deuxième couche est la colonne.

** 6. Vérifiez si la valeur réécrite est reflétée スクリーンショット 2020-03-01 23.06.43.png

Exactement, seules les colonnes A et B des lignes 1 et 2 ont été réécrites avec les valeurs spécifiées.

** 7. Format de réécriture ** Ensuite, réécrivons non seulement la valeur mais également le format avec le code suivant.

test_ss.change_format(sheet_num=0, SPREADSHEET_ID = spreadsheet_id, value_list=test_ss.values) #Méthode de réécriture de format

La raison de prendre value_list comme argument est de lire le nombre de matrices à éditer.

** 8. Vérifiez si le format réécrit est reflété **

スクリーンショット 2020-03-01 23.19.36.png

Le format n'a été modifié que là où la valeur est entrée.

Cette fois, j'ai appliqué une ligne réglée à toute la liste et j'ai rendu les caractères de la première ligne grands et gras. Si vous souhaitez le formater comme vous le souhaitez, veuillez réécrire le contenu de la demande en vous référant à la référence de l'API Google Sheets.

Recommended Posts

Modifier la feuille de calcul Google avec Python (cas RPA à faible coût avec API Google et Python)
Modifier la diapositive (Powerpo pour Google) avec Python (cas RPA à faible coût avec API Google et Python)
Jouez avec Google Spread Sheet avec Python (OAuth)
RPA à faible coût avec l'API Google et Python -Publier les données du tableau dans les diapositives: présentation du cas d'utilisation-
Appeler les API Google G Suite (Sheets / Slides, etc.) avec Python
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
Essayez d'exécuter Google Chrome avec Python et Selenium
Suivi automatique sur Twitter avec python et sélénium! (RPA)
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Étudiez Python avec Google Colaboratory
python avec pyenv et venv
Accédez à Google Drive avec Python
Fonctionne avec Python et R
Essayez d'afficher la carte google et la carte géographique avec python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Lire et écrire du CSV avec Python
Sélénium et python pour ouvrir Google
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
Automatisez les opérations du clavier et de la souris avec python pour rationaliser le travail quotidien [RPA]