[PYTHON] Dupliquer le modèle de document préparé dans Google Drive avec PyDrive2

introduction

Dans cet article, je vais utiliser PyDrive2 (GitHub) parmi les packages qui exploitent Google Drive avec Python. En guise de mémorandum, je résumerai comment faire fonctionner Google Drive à partir de PyDrive2 via l'API Drive et dupliquer le document spécifié.

À propos de PyDrive2

PyDrive2 est un fork maintenu de PyDrive. Les mises à jour de PyDrive sont arrêtées depuis plus d'un an et PyDrive 2 est sorti en janvier 2020.

Veuillez vérifier ce qui suit pour une explication un peu plus détaillée et les paramètres concernant l'authentification lors de l'utilisation de PyDrive2. Autour de l'authentification du package PyDrive2 qui exploite Google Drive avec Python

Notez que PyDrive et PyDrive2 accèdent à l'API Drive ** v2 **. Veuillez noter que l'API Drive dispose également de la v3.

Environnement d'exploitation

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G3020
$ python -V
Python 3.8.1
$ pip list | grep PyDrive2
PyDrive2                 1.4.10

Les fichiers sont organisés selon Authentification du package PyDrive2 qui exploite Google Drive avec Python.

.
├── my_client_secrets.json
├── saved_credentials.json
└── settings.yaml

Chose que tu veux faire

Laissez le script Python faire une ** copie du modèle de procès-verbal ** du document Google.

Contexte

Au moment de MTG, nous prenons conjointement des minutes dans Google Documents.

テンプレートドキュメント例.png

J'ai trouvé ennuyeux de dupliquer le modèle de minutes pour chaque MTG et j'ai commencé à penser à l'automatisation. Ainsi, dans un premier temps d'automatisation, j'ai créé un ** script qui se duplique après avoir spécifié l'ID du document Google **.

Qu'est-ce qu'un identifiant de document Google?

L'URL du document Google est la suivante.

https://docs.google.com/document/d/1******************************************o/edit#

Parmi ceux-ci, «1 *********************************************** o» La partie est l'ID (j'utilise un astérisque pour signifier le masquage).

Script Python qui duplique le document spécifié

copy_template.py


import argparse

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive


def main():
    #Analyse des arguments passés depuis la ligne de commande(1)
    parser = argparse.ArgumentParser()
    parser.add_argument("source_id")
    args = parser.parse_args()
    source_id = args.source_id

    #Faire fonctionner les objets avec Google Drive(2)
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()
    drive = GoogleDrive(gauth)

    #Copié sous le nom du fichier source de la copie_Le nom du fichier avec(3)
    source = drive.CreateFile({"id": source_id})
    source.FetchMetadata("title")
    dest_title = f"copied_{source['title']}"

    #Faire une copie(4)
    copied_file = {"title": dest_title}
    f = (
        drive.auth.service.files()
        .copy(fileId=source_id, body=copied_file)
        .execute()
    )

    #Afficher l'URL pour accéder au fichier créé(5)
    dest = drive.CreateFile({"id": f["id"]})
    dest.FetchMetadata("alternateLink")
    print(dest["alternateLink"])


if __name__ == "__main__":
    main()

Résultat d'exécution

Placement des fichiers


.
├── copy_template.py
├── my_client_secrets.json
├── saved_credentials.json
└── settings.yaml

Comment utiliser


$ python copy_template.py --help
usage: copy_template.py [-h] source_id

positional arguments:
  source_id

optional arguments:
  -h, --help  show this help message and exit

Une fois exécuté, l'URL du document dupliqué sera affichée.

$ python copy_template.py 1******************************************o
https://docs.google.com/document/d/1******************************************c/edit?usp=drivesdk

Commentaire de code

Je n'ai pas trouvé de moyen de dupliquer (copier) le document spécifié dans PyDrive Documents [^ 1] .. J'ai donc recherché le problème de PyDrive et trouvé un problème auquel je pourrais me référer. Create a copy of the file #85 (Comment) Il est mis en œuvre en fonction de cela.

[^ 1]: Le document PyDrive est affiché en tant que document PyDrive2 (à partir de mai 2020).

Mécanisme de réplication (code (4))

En fonction du résultat de l'authentification, créez un objet (gdrive) pour faire fonctionner Google Drive.

Dupliquer nécessite l'ID du document source et le titre du document de destination.

--ID du document source: transmis depuis la ligne de commande

Récupérer les fichiers Google Drive (code (3))

Pour travailler avec des fichiers sur Google Drive à partir de l'objet gdrive, utilisez la méthode CreateFile.

source = drive.CreateFile({"id": source_id})

La valeur de retour de la méthode CreateFile est une instance GoogleDriveFile. ** Spécifiez un ID ** et Créer un fichier pour permettre au fichier d'être manipulé via l'instance GoogleDriveFile.

Obtenir des métadonnées pour les fichiers Google Drive (codes (3), (5))

Il y a beaucoup d'informations (métadonnées) dans le fichier Google Drive, mais seul l'ID peut être obtenu par la méthode ci-dessus. Si vous avez les informations que vous souhaitez obtenir

  1. Spécifiez l'attribut que vous souhaitez obtenir avec la méthode FetchMetadata de GoogleDriveFile
  1. Accédez en utilisant le nom d'attribut que vous souhaitez acquérir comme clé

Cela devient la procédure.

Si vous souhaitez spécifier l'attribut que vous souhaitez obtenir en 1, spécifiez-le conformément à la référence suivante. https://developers.google.com/drive/api/v2/reference/files

Copier des fichiers depuis Google Drive (code (4))

Puisque «GoogleDrive» et «GoogleDriveFile» n'ont pas de méthode pour faire une copie du fichier, il semble que le point de terminaison «Files: copy» soit appelé directement depuis le «google-api-python-client» que PyDrive2 encapsule. est.

Cela ne fonctionne-t-il pas avec un Drive partagé?

Si vous souhaitez spécifier l'ID du document sur le lecteur partagé, vous devez modifier le code (4) pour copier. Passez «True» dans l'argument «supportsAllDrives».

copy_template.py


    #Faire une copie(4)
    copied_file = {"title": dest_title}
    f = (
        drive.auth.service.files()
        .copy(fileId=source_id, body=copied_file, supportsAllDrives=True)
        .execute()
    )

Selon https://developers.google.com/drive/api/v2/enable-shareddrives

supportsAllDrives — Whether the requesting application supports both My Drives and shared drives. If false, then shared drive items are not included in the response.

Par conséquent, vous pouvez également exploiter des fichiers sur le lecteur partagé en spécifiant «True». Si vous ne spécifiez pas cet argument, l'API Drive renverra "Fichier non trouvé".

Les fichiers de mon lecteur peuvent être copiés même si supportsAllDrives = True est spécifié. Par conséquent, vous pouvez toujours le spécifier, mais il semble que vous n'ayez pas besoin de le spécifier après juin 2020. D'après la documentation sur le point de terminaison Files: copy, après le 1er juin 2020, l'argument supportsAllDrives sera Il est obsolète et vous pouvez travailler avec des fichiers sur le lecteur partagé sans le spécifier [^ 4].

En ce qui concerne le fonctionnement du lecteur partagé, certains problèmes ont été rencontrés dans PyDrive [^ 2], mais il semble qu'il soit pris en charge dans PyDrive2 [^ 3].

[^ 3]: Capturé dans Commit janvier 2020

La portée peut-elle être réduite?

Comme mentionné dans Authentification du package PyDrive2 qui exploite Google Drive avec Python, une portée plus large (https://www.googleapis.com" / auth / drive) est utilisé. J'ai essayé de spécifier si cela pouvait être réduit lors de la duplication du fichier, mais je ne pouvais pas le réduire [^ 5].

[^ 5]: J'ai essayé drive.file, drive.metadata et leurs combinaisons en tant que portées, mais [L'utilisateur n'a pas accordé à l'application {appId} {verb} l'accès au fichier {fileId}]( L'erreur https://developers.google.com/drive/api/v2/handle-errors#resolve_a_403_error_the_user_has_not_granted_the_app_appid_verb_access_to_the_file_fileid) n'a pas été résolue.

Quand j'ai fait référence à Files: copy Endpoint Scope, https: //www.googleapis. De com / auth / drive, j'ai trouvé qu'il n'était pas possible de réduire.

À la fin

Nous avons résumé comment dupliquer un document Google en spécifiant l'ID dans PyDrive2.

Les documents et les feuilles de calcul sont des fichiers lorsqu'ils sont affichés à partir de Google Drive. Par conséquent, je pense qu'il est possible de dupliquer autrement que le document par cette méthode (à vérifier ultérieurement).

Recommended Posts

Dupliquer le modèle de document préparé dans Google Drive avec PyDrive2
Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Montez Google Drive avec google-drive-ocamlfuse
Accédez à Google Drive avec Python
Téléchargez des fichiers Google Drive en Python
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
Implémenté dans Dataflow pour copier la structure hiérarchique de Google Drive vers Google Cloud Storage
Chargez csv avec des colonnes en double dans pandas
Comportement lors du retour dans le bloc with
Afficher Python 3 dans le navigateur avec MAMP
Comment rechercher Google Drive dans Google Colaboratory
Obtenez des vacances avec l'API Google Agenda
Télécharger des images sur Google Drive avec Python