2017-10-11 2 views
1

以下では、Googleシートでスプレッドシートをプログラムで作成することができますが、シートの所有者は開発者アカウント(「gserviceaccount.com」で終わる狂った文字列です)で、通常のアカウントでスプレッドシートを表示できません。 Googleユーザーを読み取り/書き込み権限に追加するには、他に何が必要ですか?Googleスプレッドシートのオーナーを変更するにはどうすればよいですか?

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() 

編集:
私は['https://www.googleapis.com/auth/drive']にスコープを変更しようとしたが、以下の答えはまだ私のために動作しません。私はつまり

['new_batch_http_request', u'spreadsheets'] 

を取得

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

を実行すると、私はサービスが定義されているとして、permissions()serviceのメソッドではありません。私は何をすべきですか?

答えて

1

私は、Chrisが残したコメントを読んでいないと分かりました。彼のコメントから失われたのは、あなたが実際に彼のdrive_serviceに特定のスコープを使用する必要があるということです。私は別のオブジェクトを構築するために使用する範囲の変更に注意してください:だからロジックは、「スプレッドシートリソースが」あなたのサービスに設定し、所有者と、そのすべてのプロパティとシートデータをbuildから作られている

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) 

アカウント
。次に、「ドライブリソース」が作成されます。これは permissions()メソッドのリソースです。​​は、新しく作成されたアクセス許可 idをスプレッドシートファイル update()に返します。

0

documentationの方法Permissions: insertを使用してください。ファイルまたはチームドライブのアクセス許可を挿入することができます。ここで

は、ドキュメントから提供sample code次のとおりです。

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 

使用Try it nowライブデータをテストし、APIリクエストとレスポンスを参照してください。

さらに読むには、SO postにチェックを入れてください。

+0

うん、あなたの 'service'は私と同じものですか?私はこれを得ます: 'AttributeError: 'リソース'オブジェクトには属性" permissions "がありません" return service.permissions()。insert' ...ビットの 。 "service.'と入力した後にIPythonのタブを押すと、" permissions() '"はメンバーメソッドではないようです。 – dslack

+0

ああ、問題は私の 'スコープ'ですか? – dslack

+0

コメント形式よりもポスト形式で読むのが簡単だと思ったので、あなたの提案に応じて上記の投稿に編集を追加しました。正解、スコープは問題ではないようです(?) – dslack

1

サービスは、discovery.build呼び出しの結果の単なる一般名です。この場合、 'permissions'メソッドを持たないのは、同じサービスで利用できないということだけです。所有者の変更が必要ない場合は、次のコードで十分です。読み取りで誰かを追加し、書き込みアクセスを、私のために次のような作品には:

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() 

実際に所有者を変更するには、転送所有権フラグを設定する必要があります。

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() 

使用されているサービスアカウントを持っている必要がありますしかし、正しいアクセス許可。私は私のために働いたのは、最初にサービスアカウントを作成するときにgスイートボックスをチェックしていたと思います。

関連する問題