2017-10-11 1 views
1

Mit dem Folgenden kann ich programmgesteuert eine Tabelle in Google-Tabellen erstellen, aber der Besitzer des Blattes ist das Entwicklerkonto (eine verrückte Zeichenfolge mit der Endung "gserviceaccount.com"), und mein normales Konto kann die Tabelle nicht anzeigen. Was muss ich noch tun, um Google-Nutzer zu den Lese-/Schreibberechtigungen hinzuzufügen?Wie kann ich den Eigentümer einer Google Tabellen-Tabelle ändern?

from oauth2client.service_account import ServiceAccountCredentials 
from googleapiclient import discovery 

# ... json_key is the json blob that has the credentials 
scope = ['https://spreadsheets.google.com/feeds'] 
credentials = ServiceAccountCredentials.from_json_keyfile_dict(json_key, scope) 
service = discovery.build('sheets', 'v4', credentials=credentials) 

spreadsheet = { 
    "properties": {"title": "my test spreadsheet"} 
} 

service.spreadsheets().create(body=spreadsheet).execute() 

Edit:
Ich habe versucht, den Umfang zu ['https://www.googleapis.com/auth/drive'] ändern, aber die Antwort unten noch nicht für mich zu arbeiten. Als ich

laufen
print [xx for xx in dir(service) if not xx.startswith('_')] 

ich

['new_batch_http_request', u'spreadsheets'] 

Mit anderen Worten, permissions() kein Verfahren in service ist wie ich Dienst definiert. Was soll ich anders machen?

Antwort

1

Ich habe es herausgefunden, nachdem ich den Kommentar von Chris gelesen habe. Alles, was in seinen Kommentaren fehlte, ist, dass Sie in der Tat bestimmte Bereiche in seinem drive_service verwenden müssen. Beachten Sie die Änderungen im Umfang verwenden, um ich die verschiedene Objekte zu bauen:

from oauth2client.service_account import ServiceAccountCredentials 
from googleapiclient.discovery import build 

key = '/path/to/service_account.json' 

# Build 'Spreadsheet' object 

spreadsheets_scope = [ 'https://www.googleapis.com/auth/spreadsheets' ] 
sheets_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, spreadsheets_scope) 

sheets_service = build('sheets', 'v4', credentials=sheets_credentials) 

# returns 'Spreadsheet' dict 
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#resource-spreadsheet 
spreadsheet = sheets_service.spreadsheets().create(
    body={ 
     "properties": { 
      'title': 'spreadsheets test', 
     }, 
     "sheets": [], 
    } 
).execute() 


# id for the created file 
spreadsheetId = spreadsheet['spreadsheetId'] 
# url of your file 
spreadsheetUrl = spreadsheet['spreadsheetUrl'] 

# Build 'Permissions' object 
drive_scope = [ 'https://www.googleapis.com/auth/drive' ] 
drive_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, drive_scope) 

drive_service = build('drive', 'v3', credentials=drive_credentials) 

# returns 'Permissions' dict 
permissions = drive_service.permissions().create(
    fileId=spreadsheetId, 
    transferOwnership=True, 
    body={ 
     'type': 'user', 
     'role': 'owner', 
     'emailAddress': '[email protected]', 
    } 
).execute() 

# apply permission 
drive_service.files().update(
    fileId=spreadsheetId, 
    body={'permissionIds': [permissions['id']]} 
).execute() 

print ('\nOpen me:\n\n%s\n' % spreadsheetUrl) 

So die Logik ist, eine ‚Tabellen Ressource‘ ist aus build mit all seinen Eigenschaften und Blattdaten, mit dem Eigentümer auf Ihren Dienst Konto. Als nächstes wird eine 'Laufwerksressource' erstellt, dies ist die Ressource mit der permissions() Methode. execute() gibt eine neu erstellte Berechtigungen ID verwendet update() die Kalkulationstabelle Datei.

0

Versuchen Sie, die Methode Permissions: insert von der documentation zu verwenden. Sie können eine Berechtigung für eine Datei oder ein Teamlaufwerk einfügen.

Hier ist die sample code aus der Dokumentation:

from apiclient import errors 
# ... 

def insert_permission(service, file_id, value, perm_type, role): 
    """Insert a new permission. 

    Args: 
    service: Drive API service instance. 
    file_id: ID of the file to insert permission for. 
    value: User or group e-mail address, domain name or None for 'default' 
      type. 
    perm_type: The value 'user', 'group', 'domain' or 'default'. 
    role: The value 'owner', 'writer' or 'reader'. 
    Returns: 
    The inserted permission if successful, None otherwise. 
    """ 
    new_permission = { 
     'value': value, 
     'type': perm_type, 
     'role': role 
    } 
    try: 
    return service.permissions().insert(
     fileId=file_id, body=new_permission).execute() 
    except errors.HttpError, error: 
    print 'An error occurred: %s' % error 
    return None 

Verwenden Try it now Live-Daten und finden Sie in der API-Anfrage und Antwort zu testen.

Für weitere Informationen, überprüfen Sie diese SO post.

+0

Hmm, ist Ihr 'Service' die gleiche Sache wie meins?Ich bekomme das: 'AttributError: 'Ressource' Objekt hat kein Attribut 'Berechtigungen'' auf das" 'return service.permissions(). Einfügen' ..." Bit. Anders gesagt, wenn ich in IPython nach der Eingabe von "' service. "auf die Registerkarte klicken, scheint" 'permissions()' "keine Mitgliedsmethode zu sein. – dslack

+0

Oh, vielleicht ist das Problem mein 'Scope'? – dslack

+0

Ich habe dem obigen Beitrag eine Bearbeitung hinzugefügt, die auf Ihren Vorschlag reagiert, weil ich dachte, dass es einfacher ist, das Post-Format als das Kommentar-Format zu lesen. Upshot, der "Scope" scheint nicht das Problem zu sein. (?) – dslack

1

Dienst ist nur ein generischer Name für das Ergebnis eines discovery.build-Aufrufs. In diesem Fall ist es nicht so, dass die Methode "Berechtigungen" nicht für denselben Dienst verfügbar ist. Der folgende Code sollte ausreichen, wenn ein Besitzerwechsel nicht erforderlich ist. Für jemanden mit Lese hinzufügen und Schreibzugriff, die folgenden Werke für mich:

def grant_permissions(spreadsheet_id, writer): 
    drive_service = discovery.build('drive', 'v3') 

    permission = drive_service.permissions().create(
     fileId=spreadsheet_id, 
     body={ 
      'type': 'user', 
      'role': 'writer', 
      'emailAddress': writer, 
     } 
    ).execute() 

    drive_service.files().update(
     fileId=spreadsheet_id, 
     body={'permissionIds': [permission['id']]} 
    ).execute() 

Um tatsächlich den Besitzer zu ändern, muss die Übertragung Eigentum Flag gesetzt werden:

def change_owner(spreadsheet_id, writer): 
    drive_service = discovery.build('drive', 'v3') 

    permission = drive_service.permissions().create(
     fileId=spreadsheet_id, 
     transferOwnership=True, 
     body={ 
      'type': 'user', 
      'role': 'owner', 
      'emailAddress': writer, 
     } 
    ).execute() 

    drive_service.files().update(
     fileId=spreadsheet_id, 
     body={'permissionIds': [permission['id']]} 
    ).execute() 

Das Konto-Dienst verwendet werden müssen die richtigen Berechtigungen jedoch. Ich glaube, diejenigen, die für mich arbeiteten, prüften die g Suite-Box, wenn sie das Dienstkonto zuerst erstellten.

Verwandte Themen