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é.
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.
$ 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
Laissez le script Python faire une ** copie du modèle de procès-verbal ** du document Google.
Au moment de MTG, nous prenons conjointement des minutes dans Google Documents.
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 **.
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).
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()
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
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).
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
copied_
au titre du document source.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
.
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
FetchMetadata
de GoogleDriveFile
source.FetchMetadata (" titre ")
source ['titre']
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
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.
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
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.
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).