Ruby用Google DriveとSpreadsheetのまとめ


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のプログラムです。

```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というファイル名で保存する例が以下になります。フォルダを指定しなければ、プログラムのルートフォルダにファイルが保存されます。

```ruby
@service.get_file(file.id,{download_dest: "readme.txt"})
```
### ファイルを送信する
この例では、src.txtのファイルを、google driveのfolder_idが示すフォルダに、dst.txtというファイル名で保存しています。
"parents"はArray型で設定する必要があります。

```ruby
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を指定するだけです。

```ruby
@service.delete_file(file.id)
```

## google spreadsheet
### range
データを追加、取得双方ともrangeを設定する必要があります。
rangeは次の書式に従って設定してください。

- range = "sheet1!A:C"<br>sheet1のA:Cにデータを追加、またはデータを取得します。 
- range = "A:C"<br>デフォルトのシートのA:Cにデータを追加、または取得します。
- range = "sheet1!A3:C4"<br>sheet1のA3~C4の計6マスにデータを追加、または取得を行います。


### spreadsheetの最後にデータを追加する
次のコードは、
  1,2,3
  4,5,6
というデータを追加するコードです。

```ruby
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のデータを取得する

```ruby
response = @service.get_spreadsheet_values(spreadsheet_id, range)
```

### 別のアカウント、もしくはプロジェクトでログインする場合
認証情報を消去してください。

rm -r ~/.credentials