Drive API V3とSheet API V4をRubyから使用するときのまとめです。
本ページの内容はAPIとしてまとめて、"easy-google-drive"としてRubygemsから公開しました。よければ、そちらをご使用ください。
- Rubygems: sudo gem install easy-google-drive
- github: https://github.com/NaotakaSaito/easy-google-drive
Drive API
基本情報
- google driveは、ファイルをidのみで識別しています。そのため、同一フォルダに同じファイル名を存在させることができるようです。
- 各ファイルが属しているフォルダはparentsのid番号で知ることができます。
- 一番上の階層は知ることができないようです。わかったら教えてください。
mime_type
mime_typeは、ファイルの属性を示すパラメータで、次のようなタイプがあります。
MIME Type | Description |
---|---|
application/vnd.google-apps.audio | Audio |
application/vnd.google-apps.document | Google Docs |
application/vnd.google-apps.drawing | Google Drawing |
application/vnd.google-apps.file | Google Drive file |
application/vnd.google-apps.folder | Google Drive folder |
application/vnd.google-apps.form | Google Forms |
application/vnd.google-apps.fusiontable | Google Fusion Tables |
application/vnd.google-apps.map | Google My Maps |
application/vnd.google-apps.photo | |
application/vnd.google-apps.presentation | Google Slides |
application/vnd.google-apps.script | Google Apps Scripts |
application/vnd.google-apps.sites | Google Sites |
application/vnd.google-apps.spreadsheet | Google Sheets |
application/vnd.google-apps.unknown | |
application/vnd.google-apps.video | |
application/vnd.google-apps.drive-sdk | 3rd party shortcut |
ファイルやディレクトリの取得
ファイルや属性を取得するrubyのプログラムです。
begin
response = @service.list_files(
q: "name='readme.txt' and trashed = false",
spaces: 'drive',
fields: "nextPageToken, files(id, name, parents,kind,mimeType)",
page_token: page_token)
for file in response.files
ref_file.push(file)
end
page_token = response.next_page_token
end while !page_token.nil?
ポイントは次の通りです。
- "q: ...."の行で、readme.txtを探す、またゴミ箱に入っていないファイルを探しています。name='readme.txt'の部分を削除すれば、すべてのファイルを取得することができます。
- ファイルは一度に100しか取得できないため、分割して取得する必要があります。そのために、nextPageTokenをフィールドに設定しています。
- また、同じくfields:の行で、ファイルのid、名前、フォルダを示す"parents"、ファイルタイプを示す"mime_type"を取得しています。
- 共有ファイルは、parentsのパラメータがないので、それで知ることができます。
ファイルを取得する
file.idが示すファイルをreadme.txtというファイル名で保存する例が以下になります。フォルダを指定しなければ、プログラムのルートフォルダにファイルが保存されます。
@service.get_file(file.id,{download_dest: "readme.txt"})
ファイルを送信する
この例では、src.txtのファイルを、google driveのfolder_idが示すフォルダに、dst.txtというファイル名で保存しています。
"parents"はArray型で設定する必要があります。
file_metadata = Google::Apis::DriveV3::File.new(
name: "dst.txt",
mine_type: 'application/vnd.google-apps.unknown',
parents: [folder_id],
)
@service.create_file(file_metadata, upload_source: "src.txt", fields: 'id')
ファイルを消去する
delete_fileにidを指定するだけです。
@service.delete_file(file.id)
google spreadsheet
range
データを追加、取得双方ともrangeを設定する必要があります。
rangeは次の書式に従って設定してください。
- range = "sheet1!A:C"
sheet1のA:Cにデータを追加、またはデータを取得します。 - range = "A:C"
デフォルトのシートのA:Cにデータを追加、または取得します。 - range = "sheet1!A3:C4"
sheet1のA3~C4の計6マスにデータを追加、または取得を行います。
spreadsheetの最後にデータを追加する
次のコードは、
1,2,3
4,5,6
というデータを追加するコードです。
value_range_object = {
majorDimension:"ROWS",
values: [[1,2,3],[4,5,6],
}
update_res = @service.append_spreadsheet_value(spreadsheet_id, range, value_range_object, value_input_option: 'USER_ENTERED')
spreadsheetのデータを取得する
response = @service.get_spreadsheet_values(spreadsheet_id, range)
別のアカウント、もしくはプロジェクトでログインする場合
認証情報を消去してください。
rm -r ~/.credentials