[PYTHON] Duplizieren Sie die in Google Drive erstellte Dokumentvorlage mit PyDrive2

Einführung

In diesem Artikel werde ich PyDrive2 (GitHub) aus den Paketen aufnehmen, die Google Drive mit Python betreiben. Als Memorandum werde ich zusammenfassen, wie Google Drive von PyDrive2 über die Drive-API betrieben wird, und das angegebene Dokument duplizieren.

Über PyDrive2

PyDrive2 ist eine gewartete Gabel von PyDrive. Die Aktualisierungen von PyDrive wurden über ein Jahr lang eingestellt, und PyDrive 2 wurde im Januar 2020 veröffentlicht.

Weitere Informationen und Einstellungen zur Authentifizierung bei Verwendung von PyDrive2 finden Sie im Folgenden. Um die Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt

Beachten Sie, dass PyDrive und PyDrive2 auf die Laufwerks-API ** v2 ** zugreifen. Bitte beachten Sie, dass die Drive API auch v3 hat.

Betriebsumgebung

$ 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

Die Dateien werden gemäß Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt abgelegt.

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

Was du machen willst

Lassen Sie das Python-Skript eine ** Kopie der Minutenvorlage ** des Google-Dokuments erstellen.

Hintergrund

Zum Zeitpunkt von MTG nehmen wir uns gemeinsam Minuten in Google Dokumente.

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

Ich fand es langweilig, die Minutenvorlage für jedes MTG zu duplizieren, und begann über Automatisierung nachzudenken. Als ersten Schritt in der Automatisierung habe ich ein ** Skript erstellt, das nach Angabe der ID des Google-Dokuments ** dupliziert wird.

Was ist eine Google-Dokument-ID?

Die URL des Google-Dokuments lautet wie folgt.

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

Von diesen 1 ************************************************* o Der Teil ist die ID (ich benutze ein Sternchen, um Maskierung zu bedeuten).

Python-Skript, das das angegebene Dokument dupliziert

copy_template.py


import argparse

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


def main():
    #Analysieren der über die Befehlszeile übergebenen Argumente(1)
    parser = argparse.ArgumentParser()
    parser.add_argument("source_id")
    args = parser.parse_args()
    source_id = args.source_id

    #Holen Sie sich Objekte, um mit Google Drive zu arbeiten(2)
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()
    drive = GoogleDrive(gauth)

    #In den Namen der Kopierquelldatei kopiert_Der Dateiname mit(3)
    source = drive.CreateFile({"id": source_id})
    source.FetchMetadata("title")
    dest_title = f"copied_{source['title']}"

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

    #URL anzeigen, um auf die erstellte Datei zuzugreifen(5)
    dest = drive.CreateFile({"id": f["id"]})
    dest.FetchMetadata("alternateLink")
    print(dest["alternateLink"])


if __name__ == "__main__":
    main()

Ausführungsergebnis

Dateipositionierung


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

Wie benutzt man


$ 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

Bei der Ausführung wird die URL des duplizierten Dokuments angezeigt.

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

Codekommentar

Ich konnte keine Möglichkeit finden, das angegebene Dokument in PyDrive Documents zu duplizieren (zu kopieren). [^ 1] .. Also suchte ich in PyDrives Problem und fand ein Problem, auf das ich mich beziehen konnte. Create a copy of the file #85 (Comment) Es wird entsprechend implementiert.

[^ 1]: Das PyDrive-Dokument wird als PyDrive2-Dokument angezeigt (Stand Mai 2020).

Replikationsmechanismus (Code (4))

Erstellen Sie basierend auf dem Authentifizierungsergebnis ein Objekt ("gdrive"), um Google Drive zu betreiben.

Für das Duplizieren ist die ID des Quelldokuments und der Titel des Zieldokuments erforderlich.

--ID des Quelldokuments: Über die Befehlszeile übergeben --Reproduktionszieltitel: Es ist in Ordnung, auch wenn es behoben ist. Fügen Sie diesmal das Präfix "kopiert" zum Titel des Quelldokuments hinzu.

Holen Sie sich Google Drive-Dateien (Code (3))

Verwenden Sie die Methode "CreateFile", um mit Dateien auf Google Drive vom Objekt "gdrive" aus zu arbeiten.

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

Der Rückgabewert der Methode "CreateFile" ist eine "GoogleDriveFile" -Instanz. ** Geben Sie eine ID ** und "Datei erstellen" an, damit die Datei über die Instanz "GoogleDriveFile" bearbeitet werden kann.

Metadaten für Google Drive-Dateien abrufen (Codes (3), (5))

Die Google Drive-Datei enthält viele Informationen (Metadaten), aber nur die ID kann mit der oben beschriebenen Methode abgerufen werden. Wenn Sie die Informationen haben, die Sie erhalten möchten

  1. Geben Sie das Attribut an, das Sie mit der Methode "FetchMetadata" von "GoogleDriveFile" erhalten möchten --Beispiel: source.FetchMetadata (" title ")
  2. Greifen Sie mit dem Attributnamen zu, den Sie als Schlüssel erwerben möchten --Beispiel: source ['title']

Es wird zum Verfahren.

Wenn Sie das Attribut angeben möchten, das Sie in 1 erhalten möchten, geben Sie es gemäß der folgenden Referenz an. https://developers.google.com/drive/api/v2/reference/files

Dateien von Google Drive kopieren (Code (4))

Da "GoogleDrive" und "GoogleDriveFile" keine Methode zum Erstellen einer Kopie der Datei haben, wird der Endpunkt "Files: copy" anscheinend direkt vom "Google-API-Python-Client" aufgerufen, den PyDrive2 umschließt. ist.

Funktioniert es nicht mit einem freigegebenen Laufwerk?

Wenn Sie die ID des Dokuments auf dem freigegebenen Laufwerk angeben möchten, müssen Sie den zu kopierenden Code (4) ändern. Übergeben Sie "True" im Argument "supportAllDrives".

copy_template.py


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

Laut 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.

Daher können Sie Dateien auch auf dem freigegebenen Laufwerk bearbeiten, indem Sie "True" angeben. Wenn Sie dieses Argument nicht angeben, gibt die Drive-API "Datei nicht gefunden" zurück.

Dateien in "Mein Laufwerk" können kopiert werden, auch wenn "supportAllDrives = True" angegeben ist. Daher können Sie es jederzeit angeben, aber es scheint, dass Sie es nach Juni 2020 nicht mehr angeben müssen. Laut Files: copy-Endpunktdokumentation lautet das Argument" supportAllDrives "nach dem 1. Juni 2020 Es ist veraltet und Sie können mit Dateien auf dem freigegebenen Laufwerk arbeiten, ohne es anzugeben [^ 4].

In Bezug auf den Betrieb des gemeinsam genutzten Laufwerks wurden einige Probleme in PyDrive [^ 2] festgestellt, aber es scheint, dass dies in PyDrive2 [^ 3] unterstützt wird.

[^ 3]: Erfasst in Commit vom Januar 2020

Kann der Umfang eingegrenzt werden?

Wie in Authentifizierung des Pakets PyDrive2, das Google Drive mit Python betreibt erwähnt, wird ein größerer Bereich (https://www.googleapis.com") erweitert. / auth / drive) wird verwendet. Ich habe versucht anzugeben, ob dies beim Duplizieren der Datei eingegrenzt werden kann, aber ich konnte es nicht eingrenzen [^ 5].

[^ 5]: Ich habe drive.file, drive.metadata und deren Kombinationen als Bereiche ausprobiert, aber [Der Benutzer hat der App {appId} {verb} keinen Zugriff auf die Datei {fileId} gewährt]( Der Fehler 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) wurde nicht behoben.

Als ich auf Files: copy Endpoint Scope verwies, https: //www.googleapis. Von com / auth / drive habe ich festgestellt, dass es nicht möglich ist, einzugrenzen.

Am Ende

Wir haben zusammengefasst, wie ein Google-Dokument durch Angabe der ID in PyDrive2 dupliziert wird.

Sowohl Dokumente als auch Tabellenkalkulationen sind Dateien, wenn sie von Google Drive aus angezeigt werden. Daher denke ich, dass es möglich ist, andere als das Dokument mit dieser Methode zu duplizieren (um zu einem späteren Zeitpunkt überprüft zu werden).

Recommended Posts

Duplizieren Sie die in Google Drive erstellte Dokumentvorlage mit PyDrive2
Rund um die Authentifizierung von PyDrive2, einem Paket zum Betreiben von Google Drive mit Python
So laden Sie Dateien in Google Drive mit Google Colaboratory
Hängen Sie Google Drive mit google-drive-ocamlfuse ein
Greifen Sie mit Python auf Google Drive zu
Laden Sie Google Drive-Dateien in Python herunter
Erstellen und bearbeiten Sie Tabellenkalkulationen in einem beliebigen Ordner auf Google Drive mit Python
In Dataflow implementiert, um die hierarchische Struktur von Google Drive in Google Cloud Storage zu kopieren
Laden Sie csv mit doppelten Spalten in Pandas
Verhalten bei der Rückkehr in den with-Block
Zeigen Sie Python 3 im Browser mit MAMP an
So suchen Sie in Google Colaboratory nach Google Drive
Holen Sie sich Urlaub mit der Google Kalender-API
Laden Sie Bilder mit Python auf Google Drive hoch