【0からGASを学ぶ】GASでDrive APIを利用する場合は気をつけろ！Exif情報の取得は癖がある！

# はじめに
本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。

# シリーズの対象者
* そもそもGASってなんだか**わからない**方
* GASを学びたいけど**何から始めればいいか**わからない方
* GASはわかり始めたけど、**もっと活用ができないか**と模索している方
* とにかく**Googleが好き！** という方

# 前回記事
https://qiita.com/gas-suke/items/efde164744255741c8c7

# GASでExif情報を取得する
では早速始めていきましょう。【0からGASを学ぶ】シリーズの第20回は「GASでDrive APIを利用する場合は気をつけろ！Exif情報の取得は癖がある！」です。今回は、**GASで画像のExif情報を扱う場合のTips**です。実は、先日画像の撮影日時を取得できないかと相談を受け、Drive APIを使えばできるのは知っていたのでやってみたところ、**ちょっと思わぬ挙動がありました**ので、お伝えします。本回は短めなのでささっといきましょう。

## 事前準備
### 適当な撮影画像をGoogleドライブにアップロードする
今回は**Exif情報を取得する手順**をお伝えしますので、Googleドライブ上にPCやスマホから適当な写真をアップロードしましょう。

### アップロードした画像のファイルIDを取得する
アップロードした画像ファイルのIDをGUIで取得する際は、**画像をダブルクリックして画面に表示してもファイルIDを確認することはできません**。以下のように、ファイルの共有リンクをコピーしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/90b60f3b-3c6c-8404-d1f0-170d2fe0c4a3.png" width=600>
コピーした文字列を確認すると以下のようになっているかと思います。
`https://drive.google.com/file/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXX/view?usp=drive_link`
このうち **`XXXXXXXXXXXXXXXXXXXXXXXXXXXX`** となっている箇所がファイルIDとなります。

## プログラム開始
### GASエディタを開く
今回は**スタンドアロン型**でGASを記述していきます。[こちら](https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838#%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%E5%9E%8B)を参考にGASエディタを起動してください。では、どんどんいきますよ、ついてきてください。

### Drive APIを追加する
これは当然のことながら、Drive APIを利用するためには**Drive APIを利用できるようにGASエディタ上でサービスの追加**が必要となります。
<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>GASエディタの左メニューより「サービス」横の「＋」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/915a599f-8929-8cec-7876-83ebb71e5c01.png" width="400"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>表示されたダイアログ上でDrive APIを選択し、バージョン（最新がv3）とIDはそのままで「追加」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/a0159801-c68e-1fe9-56c8-8fb88ff0ad33.png" width="400"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>エディタにサービス：Driveが追加されれば完了です。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/2cdf9e8e-7768-7225-228a-df27ff9f3579.png" width="400"></td>
  </tr>
</table>

### Drive APIのリファレンスに従い、撮影日時を取得する
#### Fileインスタンス：Files.getによる取得結果に関するリファレンス
https://developers.google.com/drive/api/reference/rest/v3/files?hl=ja#File

:::note info 
上記リファレンスの中段に`imageMediaMetadata`に関する記述があり、写真の撮影日時（EXIF DateTime）は
```javascript
imageMediaMetadata.time	
```
と取得すればよいことがわかる。
:::

#### プログラム
```javascript:Qiita020
function Qiita020 () {
  // 取得しておいた画像のファイルIDを引数とする
  console.log (getShootingDate('XXXXXXXXXXXXXXXXXXXXXXXXXXXX'));
}

function getShootingDate(id) {
  // Drive APIを用いて、Exifデータを取得する
  let metaData = Drive.Files.get(id).imageMediaMetadata;
  return metaData ? metaData.time : null;
}
```

#### 実行結果
```bash
17:42:31	お知らせ	実行開始
17:42:31	情報	null
17:42:32	お知らせ	実行完了
```

ダメでした、なぜでしょう。実は、デバッグしてみるとわかりますが、`Drive.Files.get(id)`の取得結果であるFileインスタンス自体に`imageMediaMetadata`プロパティがありません。そのため、取得結果がnullになっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/50d1cb52-cf26-388e-c364-2318eea31cc4.png" width=600>

:::note warn
デバッグで確認するとFileインスタンスに`getImageMediaMetadata()`メソッドがあり、じゃあこれで取得できるのではと思っても、やはりうまく取得はできません。
:::

### Drive APIのV2を追加する
前段が長くなりましたが、**ここからがTips**です。
先ほどと同様にDrive APIを追加します。ただし、**最新のバージョンではなくv2を追加**します。
<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>GASエディタの左メニューより「サービス」横の「＋」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/915a599f-8929-8cec-7876-83ebb71e5c01.png" width="400"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>表示されたダイアログ上でDrive APIを選択し、
      <ul>
        <li>バージョンは<b>v2</b>を選択（すでにv3は追加済みなのでv2のみの表示となるはず）</li>
        <li>IDは<b>Drive_v2</b>と記載（Driveはすでにv3を利用するための名称として使用しているため）</li>
      </ul>
    としたのちに「追加」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/a92f028a-23d6-fe12-715c-d06d2fe9cc6b.png" width="400"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>エディタにサービス：Drive_v2が追加されれば完了です。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/6fbfe336-1910-2a38-5469-63e258ec8c54.png" width="400"></td>
  </tr>
</table>

### Drive API（v2）のリファレンスに従い、撮影日時を取得する
#### Fileインスタンス：Files.getによる取得結果に関するリファレンス
https://developers.google.com/drive/api/reference/rest/v2/files?hl=ja#File

:::note info 
上記リファレンスの中段に`imageMediaMetadata`に関する記述があり、写真の撮影日時（EXIF 形式のタイムスタンプ）は
```javascript
imageMediaMetadata.date	
```
と取得すればよいことがわかる。**v3とv2では`time`と`date`と絶妙に異なるのが若干やきもきする。**
:::

#### プログラム
```javascript:Qiita020
function Qiita020 () {
  // 取得しておいた画像のファイルIDを引数とする
  console.log (getShootingDate('XXXXXXXXXXXXXXXXXXXXXXXXXXXX'));
}

function getShootingDate(id) {
  // Drive APIを用いて、Exifデータを取得する
  let metaData = Drive_v2.Files.get(id).imageMediaMetadata;
  return metaData ? metaData.date : null;
}
```

#### 実行結果
```bash
17:50:53	お知らせ	実行開始
17:50:54	情報	2024:01:05 22:20:38
17:50:54	お知らせ	実行完了
```
ばっちりです！！！！

#### Tips
今回はそもそも`v2のDrive API`を追加すれば解決ではありますが、**すでに`v3のDrive API`を追加しており、ダウングレードしたくない**といった事情もあるかと思います。そのため、上記のように`v2`と`v3`を**共存**するやり方であれば、**Exif情報を取得する場合には`v2`、その他通常利用の場合は`v3`という運用が実現**できます。

# おわりに
お疲れ様でした。
第20回は少々**緊急企画的**に「GASでDrive APIを利用する場合は気をつけろ！Exif情報の取得は癖がある！」と題して、**GASで画像のExif情報を扱う場合のTips**をお伝えしました。GASは非常に便利ですが、たまに**こういうクセに出くわすことも**あります。そんな時は、**私のQiita記事やブログを見たり、時にはお問い合わせ等いただければ**解決に向けて検証を進めてまいります。引き続き、GASを楽しんでいきましょう！！
記事を読んで、「良いな」や「今後に期待できる！」と感じて頂けたら**いいね**や**フォロー**、**コメント**いただけると幸いです。それではまた次回をお楽しみに！

:::note info
ブログではより細かく紹介していますので、ぜひ<a href="https://gas-4u.com/" target="_blank">こちらもアクセス！！</a>
:::