容量パンパンのスマホを救え！画像を縮小して自動で保存したい

## :camera: 推し活あるある？！限界を迎えるスマホ容量
最近ものすごい沼に足を踏み入れてしまったんです。
それは・・・**推し活！！** 女の子13人グループを箱推ししているのですが、全員かわいいんですよもう！！

一瞬も逃したくない
 ↓
めちゃめちゃ写真を撮る
 ↓
データフォルダやばい

もともと、仕事で記録用の写真もたくさん撮る私。
ついにその時がやってきました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/3a1c5b7b-1dd2-f2eb-2199-b519d74e53e8.jpeg" width="50%">

だからと言って、iCloudに今（200GB）以上課金するのももったいない・・・。ということで・・・

## :robot: ChatGPTと膝を突き合わせて、画像縮小＆保存をほぼ自動化してみた！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/1aed43af-de30-b128-8e56-46fc959d7b54.png)

まずは、完成イメージをご紹介！こちらが全体の流れです。

#### 必要ツール
* ショートカット（iPhone搭載機能）
* Google Apps Script

:::note warn
この記事と同様のアクションを行うには、iPhoneのメールアプリにGmailのメールアドレスを登録しておく必要があります。
:::

プログラミングについて、なんにも知らない私。
もちろん、この仕組みChatGPTと一緒に考えました。
それでは、振り返りながら順番にご紹介していきまます！

## 0. ChatGPTに相談
1から100までChatGPTに聞いていきます。手始めにどんなツールが使えるか相談した会話の内容が、こちら。

※会話内容は初期構想段階のものであり、実際の完成品とは一致しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/48c28917-6313-20e2-a30f-86814c1ecc50.png)


おおおおお、めっちゃ教えてくれる・・・！
なんとiPhoneにデフォルトで搭載されているアプリ「ショートカット」を使用するという提案。

自分で１から作らなきゃいけないと思っていたけど、**既存のツールは賢く使え！！** ってことね！これなら私にもできそう。

### 1. ショートカットで画像を縮小

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/8d569091-f982-7d59-f88b-434b4218321f.png)

まずはiPhoneをポチポチ操作して、ショートカットを作っていきます。
ショートカットアプリを開いたら右上の＋ボタンで新しいショートカットを作成します。後から使うときのために名称を変更しておきましょう。
「＋アクションを追加」から4つのアクションを追加します。

**➀写真を選択**
縮小したい画像を選択しするステップです。
複数選択できるように、図のように設定しておくと便利です。

**➁画像をサイズ変更**
どんなサイズに変更するかをここで設定します。
固定の数字を入れる、割合で指定する、その都度決めるなどの選択肢があります。

**➂メール送信（下書き保存）**
選択するアクションは「メール送信」ですが、実際は送信せずに下書き保存するだけです。このアクションで件名を指定することで、後々のステップの自動保存が可能になります。ここでは、メール件名を「圧縮希望」にしています。

**➃写真の削除（縮小後の画像）**
縮小後の画像を削除します。

**➄写真の削除（縮小前の元画像）**
更に、もう１つ写真の削除を追加しておくと便利です。元画像も自動で削除できるようになります。写真をちゃんと保存できたか確認してから削除したい・・・など自分でカスタマイズしてくださいね。

<details><summary>なぜ、縮小後の動画を直接Google Driveに保存しないのか</summary>


それができたらシンプルでやりやすいですよね。
それをしなかった理由は2つ。
* ショートカット機能ではGoogle Driveへのアップロードが自動でできないから
* Google Driveへのファイルの手動アップロード中は画面を閉じられない（バックグラウンドで実行できない）から

たくさんのデータをアップロードする場合、ずっとその画面が開かれていないとエラーになってしまいます。さらに言うと、アップロード中に時間がたって画面がオフになってしまってもだめ。

これを解決するのが、メールへの添付だったというわけです。


</details>

:::note info
“➂メールの送信”のステップについて、この記事では送信をせずに下書き保存をしています。これは、送受信にかかる時間を削減するためです。
:::



それでは、今作成したショートカットを動かしてみます。
動画はこちら↓↓↓

https://x.com/tabisurujapaniz/status/1828109697452572870

何度か操作が必要ですが、何枚もの写真を一気に縮小できます。
メールが作成されたら、左上のＸボタンをタップして「下書きを保存」を選択します。これでGmailの下書きにメールが保存されています。

### 2. Google Apps Scriptを使ってGoogle Driveに自動保存

![Picture3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/621d5dc2-3f77-67fe-0a88-da56493666aa.png)

あらかじめGoogle Driveに、縮小後の画像を保存するフォルダを作っておきます。自動化したい内容は以下の通り。

* Gmailの下書きから、「圧縮希望」という件名のメールをフィルターする
* 該当のメールの添付画像を取得する
* 取得した画像の撮影日時に従って、ファイル名をつける
* 取得した画像をGoogle Driveの「圧縮画像保管」フォルダに保存する
* 画像の保存が完了したら、下書きメールを削除する

初めてのGoogle Apps Script(GAS)。ドキドキ・・・。
さあ頼んだわよ、ChatGPT！

```ruby: javascript
function saveDraftImagesToDrive() {
  var subjectFilter = "圧縮希望"; // 下書きメールの件名フィルター
  var folderName = "圧縮画像保管"; // 画像を保存するフォルダ名

  // 保存先のGoogleドライブフォルダを取得
  var folderIterator = DriveApp.getFoldersByName(folderName);
  if (!folderIterator.hasNext()) {
    Logger.log("フォルダが見つかりません: " + folderName);
    return;
  }
  var folder = folderIterator.next();

  // Gmailの下書きを取得し、件名でフィルタリング
  var drafts = GmailApp.getDrafts().filter(function(draft) {
    return draft.getMessage().getSubject().indexOf(subjectFilter) !== -1;
  });

  drafts.forEach(function(draft) {
    var message = draft.getMessage();
    var attachments = message.getAttachments();

    attachments.forEach(function(attachment) {
      if (attachment.getContentType().startsWith("image/")) { // 画像ファイルのみ処理
        var blob = attachment.copyBlob();
        
        // 画像のメタデータから作成日時を取得 (GASでは難しいため代わりに現在日時を使用)
        var creationDate = new Date(); // 仮に現在日時を使用
        var formattedDate = Utilities.formatDate(creationDate, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");

        // 新しいファイル名を設定
        var extension = attachment.getName().split('.').pop(); // ファイル拡張子を取得
        var newFileName = formattedDate + "." + extension;

        // 画像をGoogleドライブに保存
        folder.createFile(blob.setName(newFileName));
        Logger.log("Saved: " + newFileName);
      }
    });

    // 画像保存が完了したら、下書きを削除
    draft.deleteDraft();
    Logger.log("Deleted draft with subject: " + message.getSubject());
  });
}
```

い、、、一瞬で書きおった。これをGoogle Apps Scriptにコピペするだけ！
それでは早速、さっき下書きに保存したメールから画像を保存してみましょう。

https://x.com/tabisurujapaniz/status/1828212958599749871

おー！！ちゃんと画像を保存したっぽいぞ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/9f074adf-30c9-3ca4-6032-82ee53fea0ed.png)
下書き削除OK！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/30438cdc-dce1-c5e5-2040-29982a5628ba.png)
画像も名前を付けて保存されています！

### 3. スクリプトの実行を自動にする

これを毎回自動で行うにはどうしたら・・・？それもChatGPTに聞いてみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/287a1784-660b-e3e9-62b4-b0b908f243d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/d15de78a-ba76-d2e3-98b5-1be79d46d088.png)

ChatGPTに言われた通り設定します。実行は1時間おきに設定しておこうかな。

## :raised_hands: できた！

はい、これですべて完成です。
ショートカットを活用するという驚きの提案からスクリプトを書くところまで、ChatGPTと膝を突き合わせて相談した結果、簡単に画像縮小＆保存作業を行えるようになりました！

途中、iPhoneとGoogle各種アプリの互換性の低さで何度も設計を練り直しましたが、何とか形にすることができました。

今日から早速使って、スマホのストレージを軽くしていきたいと思います！

## 追記:gear::動画圧縮＆保存もできるだけ自動化

この記事では、画像の圧縮と保存を少ない操作で行う方法を紹介してきました。しかし、思いませんでしたか？**「動画は？動画は圧縮できないの？」** ええ、私が一番思っています。
ということで、動画の圧縮もできるだけ少ない操作で行う方法をこちらで紹介します。

全体の流れは画像の縮小＆保存と同じです。しかし、Gmailに自動で添付するという手順を自動化してしまうと、iPhoneとGoogleの互換性の問題でどうしてもデータにエラーが起きて再生できない動画になってしまいます。

では、手動でGmailに添付してはどうだろうか。こちらも試しましたが容量の問題が出てきました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/8225d656-85d2-2d22-c8a1-39a6e5f1e9b6.jpeg" width="50%">

Gmailの添付ファイルは最大25MBまでです。逆に25MB以下の動画であれば、Gmailの添付ファイルから拾うことができます！

### 1. iPhoneショートカットの設定

➀写真を選択（含めるデータをビデオのみに設定）
↓
➁写真を**エンコード** (圧縮後のサイズを指定）
↓
➂エンコード済みのメディアを **「一時保存しておくiPhone内のフォルダ名」** に保存
↓
➃保存済みのファイルを共有
↓
↓ここで手動操作でGoogle Driveにアップロードしていきます
↓
➄保存済みのファイルを削除

できたものがこちらです。
エンコードとアップロードはちょっと時間がかかるので、そこだけ動画を5倍速にしています。

https://x.com/tabisurujapaniz/status/1830184054647636168


### 2. Google Apps Scriptの設定

スクリプトはいつものようにChatGPTにお願いします。
こんなふうにお願いしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/5519b721-f90c-40ec-173b-bfc1a06bef96.png)

ChatGPTが書いてくれたものはこちら↓↓
```ruby: javascript
function renameAndMoveVideoFile() {
  var sourceFolderName = "My Drive"; // 元のフォルダ名（動画が最初に保存される場所）
  var targetFolderName = "圧縮動画保管"; // 移動先のフォルダ名
  var fileType = "video/"; // 動画ファイルを指定

  // 元のフォルダと移動先のフォルダを取得
  var sourceFolder = DriveApp.getFolderById(DriveApp.getRootFolder().getId()); // ルートフォルダを使用
  var targetFolderIterator = DriveApp.getFoldersByName(targetFolderName);

  if (!targetFolderIterator.hasNext()) {
    Logger.log("フォルダが見つかりません: " + targetFolderName);
    return;
  }
  var targetFolder = targetFolderIterator.next();

  // 元のフォルダ内のファイルを取得
  var files = sourceFolder.getFilesByType(fileType);

  while (files.hasNext()) {
    var file = files.next();

    // ファイル名のフォーマットを設定
    var creationDate = new Date(); // 仮に現在日時を使用
    var formattedDate = Utilities.formatDate(creationDate, Session.getScriptTimeZone(), "yyyy-MM-dd-HH:mm:ss");
    var newFileName = formattedDate + " 圧縮動画" + file.getName().match(/\.[0-9a-z]+$/i)[0]; // ファイル拡張子を保持

    // ファイル名を変更し、フォルダに移動
    file.setName(newFileName);
    file.moveTo(targetFolder);
    Logger.log("Moved and renamed file: " + newFileName);
  }
}
```

これをコピーしてGoogle Apps Scriptに貼り付けて、1時間ごとに実行するように設定します。
これで動画も決まったフォルダへ保存されるようになりました！