第10回 アルゴリズム概論
2026.06.11
ブラウザの使い分けについて
Phase2の講義は、 Chrome の 「通常モード」 と 「シークレットモード」 の 2つ を同時に開いて、 用途で使い分けます。
Google ドライブ / Apps Script
今日の 作業はこっち
Google Meet (この講義)
Meet入室は こっち
※ Drive や GASエディタを シークレットモードで開かない ように注意 — シークレットモードはGoogleアカウントにログインしていないので、 今日の作業ファイルが見えません。ChatGPTなどのAIツールも通常のChromeで開くようにしてください!
先にここを揃えてから今日の本題に入ります
Google Driveの 「10_20260611」 フォルダの中に、 今日使う 2種類のもの を揃えます。
10_20260611_gas を作る10_20260611_data.zip をダウンロード
ファイルの名前は 10_20260611_gas にします
「10_20260611」 フォルダの中に、Google Apps Scriptファイルを1つ作ります。
10_20260611_gas に設定
講義ページから 10_20260611_data.zip をダウンロードし、 解凍した 4つのフォルダ を
「10_20260611」 の中にアップロードします。 各フォルダの中身(画像・PDF・テキスト等)も一緒に入ります。
1コマ目 — 検索練習用(3フォルダ)
2コマ目 — ワーク用
フォルダごとドラッグ&ドロップで OK。 各フォルダを開いて URL から フォルダID をメモしておくと、 準備運動のコードに貼りやすいです。
Drive で 「10_20260611」 を開くと、 こんな見た目になっているはず。 違っていたらここで直しておきましょう。
自分が作ったバックアップを題材に、 仕組みを完成させる
第8回
バックアップを作る
複製 + 日付名 + 移動
第9回
バックアップを強化
自動化 + 履歴記録
第10回(今日)
溜まったバックアップを整理
検索 + 月別フォルダ振り分け
前回までの結果、バックアップデータが無駄に溜まる状況になりましたよね。
今回は溜まったデータを整理するのを目指します!
今日の新しい道具を1つずつ触ってみよう
searchFilesフォルダの中から、 条件に合うファイルを 検索するための道具が searchFiles です。
DriveApp.getFolderById('フォルダID')
検索対象フォルダから
.
searchFiles('mimeType contains "image/"')
画像ファイルを検索
フォルダのID の部分は、検索したい対象のフォルダのIDを指定します。
searchFiles を実行すると、 条件に合うファイルが 複数見つかる ことがあります。 1個だけ見つかっても、
同じやり方で1個ずつ確認します。
searchFiles('...') の カッコの中 には、 どんなファイルを探すかの条件を書きます。
名前で絞る
'title contains "請求書"'
ファイル名に「請求書」を含むもの
種類で絞る
'mimeType contains "image/"'
画像ファイル(jpg / png など)
更新日で絞る
'modifiedDate > "2026-06-01"'
2026年6月1日以降に更新されたもの
作成日で絞る
'createdDate < "2026-01-01"'
2026年1月1日以前に作られたもの
searchFiles で検索した結果見つかったファイルに、 1個ずつ同じ処理 を繰り返します。
while (files.hasNext()) {
検索結果として見つかったファイルに対して、 1個ずつ順番に処理する(全部終わるまで繰り返す)
const file = files.next();
今回処理したいファイルを指定
file.setName("電波電波の" + file.getName());
ファイル名の先頭に「電波電波の」をつける(第8回と同じ)
}
function myFunction() {
const folder = DriveApp.getFolderById("検索したいフォルダのID");
const files = folder.searchFiles('mimeType contains "image/"');
while (files.hasNext()) {
const file = files.next();
file.setName("電波電波の" + file.getName());
}
}
下準備で作った 10_20260611_gas を開きます。 最初から入っている function myFunction() { ... } の
中身 を、 上記のように書き換えましょう。
特定の種類のファイルのみを検索して指示をしましょう!今回は画像だけに絞ってみます。
10_20260611_gas の myFunction の中身を、 以下に 書き換え ます。
function myFunction() {
const folder = DriveApp.getFolderById("練習1_画像の束のID");
const files = folder.searchFiles('mimeType contains "image/"');
while (files.hasNext()) {
const file = files.next();
const fileName = file.getName();
file.setName("電波電波の" + fileName);
}
}
練習1_画像の束のID — 練習1_画像の束 フォルダを Drive で開き、 URL からコピーした ID に置き換えます。
コードを書き終えたら、 GASエディタ上部の 「▶ 実行」 ボタンを押します
初回実行時だけ 「権限の確認画面」 が表示されます。
Cmd + S (Mac) / Ctrl + S (Win) で保存してください。 保存し忘れると
古いコードのまま実行 されることがあります。
第8回と同じ画面です。 「権限を確認」 をクリックして進みます。 手順の詳細は第8回スライドを参照してください。
第8・9回ですでに承認済みなら、 この画面は出ないこともあります。
第8回と同じく、 Drive を開いて 変化を確認します。 練習1_画像の束 フォルダを開きましょう。
メモ.txt は 種類が違うので変わっていない はず — 絞り込みも動いています。
特定の名前が含まれるファイルのみを検索して指示をしましょう!

準備運動1のコードは、行の先頭に//をつけてメモ化します。
// 準備運動1(記録として残す)
// const folder = DriveApp.getFolderById("練習1_画像の束のID");
// const files = folder.searchFiles('mimeType contains "image/"');
// while (files.hasNext()) {
// const file = files.next();
// const fileName = file.getName();
// file.setName("電波電波の" + fileName);
// }
メモ化したコードの下に、準備運動2のコードを追加します。
// 準備運動2
const folder = DriveApp.getFolderById("練習2_雑多なファイル群のID");
const files = folder.searchFiles('title contains "議事"');
while (files.hasNext()) {
const file = files.next();
const fileName = file.getName();
file.setName("電波電波の" + fileName);
}
練習2_雑多なファイル群のID
練習2_雑多なファイル群 フォルダを Drive で開き、 URLからコピーしたIDに置き換えます。
準備運動1と同じく、保存してからGASエディタ上部の「▶ 実行」ボタンを押しましょう
権限の承認画面は 1度承認済み なので、 もう出ません。
練習2_雑多なファイル群 フォルダを開いて、 議事録.pdf と
議事メモ.txt の名前が変わっているか確認しましょう。
見積書.pdf は 名前に「議事」がないので変わっていない はず — 絞り込みも動いています。
準備運動2の 検索の条件 だけ PDF用 に書き換えてもう1回試してみましょう
(mimeType = "application/pdf" — 見積書.pdf も対象になる)。
名前で絞った行は // でコメントアウトして残します。
練習3_名前で検索 フォルダには、 ファイル名の先頭に 年月日 が入ったファイルがあります。
2026-06-01_テスト用Docs / 2026-04-12_テスト用Docs / 請求書_4月分.txt など
準備運動1は 種類、 準備運動2は 名前 で絞り、 setName で名前を変えました。 準備運動3では
月別フォルダを作って、 中身を移す 流れを、 1つずつ試します。
第8回の moveTo では、 移動先の backup_test を Drive で 手動 で作りました。
createFolder です。
月別フォルダは事前に作りません。 createFolder で 必要なときに 作ります。
DriveApp.getFolderById("練習3_名前で検索のID")
整理したいフォルダを指定
.
createFolder("2026-05")
その中に新フォルダ
createFolder のカッコの中が、 新しいフォルダの名前 です。 中身は 空 のフォルダができます。
準備運動2のコードを // でコメントアウトします。 準備運動1のコメントアウトはそのまま残します。
// 準備運動2(記録として残す)
// const folder = DriveApp.getFolderById("練習2_雑多なファイル群のID");
// const files = folder.searchFiles('title contains "議事"');
// while (files.hasNext()) {
// const file = files.next();
// const fileName = file.getName();
// file.setName("電波電波の" + fileName);
// }
まず createFolder だけ 書いて、 フォルダが作れることを確認します。 検索や moveTo は
まだ書きません。
// 準備運動3 — createFolder だけ
const baseFolder = DriveApp.getFolderById("練習3_名前で検索のID");
baseFolder.createFolder("2026-05");
練習3_名前で検索のID — 練習3_名前で検索 フォルダを Drive で開き、 URL からコピーした ID に置き換えます。
保存してから 「▶ 実行」 ボタンを押しましょう。
練習3_名前で検索 フォルダを Drive で開いて確認しましょう。
2026-05 という名前のフォルダが 新しく1つ あれば大成功!createFolder が動いています。
第8回で学んだ moveTo で、 ファイルを別フォルダへ移します。
練習3_名前で検索 から、 ファイル名に 2026-05 を含むものを探します。
title contains "2026-05"2026-05-03_テスト用Docs / 2026-05-19_テスト用Docs の2件)
createFolder だけの2行は // でコメントアウトして残し、 下に まとめて 書き直します。
// 準備運動3
const baseFolder = DriveApp.getFolderById("練習3_名前で検索のID");
const monthFolder = baseFolder.createFolder("2026-05");
const files = baseFolder.searchFiles('title contains "2026-05"');
while (files.hasNext()) {
const file = files.next();
file.moveTo(monthFolder);
}
createFolder — さきほど試した「フォルダを作る」(今回は返り値を monthFolder に記憶)moveTo — 第8回の「移動先フォルダへ移す」使う ID は 練習3_名前で検索 の1つだけ — 月別フォルダはこの中に作り、 この中で移動します。
保存してから 「▶ 実行」 ボタンを押しましょう。
2026-05 フォルダがもう1つできることがあります — 中にファイルが入っていればOKです。
練習3_名前で検索 フォルダを開いて確認しましょう。
2026-05 フォルダができていて、 中に2ファイル2026-05-03_テスト用Docs / 2026-05-19_テスト用Docs があれば 大成功!
フォルダの直下には 6月分がまだ残っている はずです。 4月・請求書なども残ったまま。
ただし — "2026-05" を直書きしているので、 6月になっても 5月分しか動きません。 今月(6月)分を動かすには、 次で
formatDate を使います。
毎月コードを書き換えるのは大変。 第9回で使った formatDate を使えば、 「今月の年月」 を自動で取れます。
new Date()
今の日時を作る
→
Utilities.formatDate(today, "JST", "yyyy-MM")
「2026-06」 形に整える
第9回は yyyy-MM-dd でした。 今日は 月まで 欲しいので yyyy-MM にします。 授業日は6月なので、
monthStr は "2026-06" になります — さきほど直書きしなかった 6月分 が動くはずです。
フォルダ名と検索の行 を書き換えます。 固定の "2026-05" を、 formatDate で作った変数
monthStr に置き換えます。
// 準備運動3(formatDate)
const baseFolder = DriveApp.getFolderById("練習3_名前で検索のID");
const today = new Date();
const monthStr = Utilities.formatDate(today, "JST", "yyyy-MM");
const monthFolder = baseFolder.createFolder(monthStr);
const files = baseFolder.searchFiles('title contains "' + monthStr + '"');
while (files.hasNext()) {
const file = files.next();
file.moveTo(monthFolder);
}
黄色 が
変わった/追加された部分。 固定の "2026-05" のブロックは // でコメントアウトして残します。
保存してから 「▶ 実行」 ボタンを押しましょう。
練習3_名前で検索 フォルダを開いて確認しましょう。
2026-06 フォルダが新しくでき、 中に 2026-06-01_テスト用Docs /
2026-06-11_テスト用Docs が入っていれば 大成功!"2026-06" を書いていないのに 今月分だけ 動いた — これが formatDate の効果です。
再実行すると 2026-06 フォルダがもう1つできることがあります — 動けばOKです。 これで1コマ目の準備運動は完了です。
準備運動3で、 検索 → createFolder → moveTo と、 formatDate の型が揃いました。 2コマ目のワークでは
整理対象フォルダを バックアップ蓄積 に変える だけです。
ワークに入る前に、 1コマ目の状態を確認しておきましょう。
myFunction はそのまま残してOK
— ワーク用の関数は、 その下に新しく追加していきます
バックアップ蓄積 フォルダはまだ触っていないか確認
— 2コマ目の整理対象はここ
第8・9回で作ってきた バックアップの仕組み。 今日はその蓄積版を題材に、 月別フォルダへ自動振り分ける GAS を作ります。
第9回までのバックアップは、 こんな弱点を抱えていました:
これを解決するために、 今日は 「検索で今月分を取り出す」 + 「月別フォルダに自動で振り分ける」 を1つの仕組みにします。
自分のバックアップフォルダには、 実際には 2日分くらい しか溜まっていません。 「月別に分ける」 が意味のある作業になるよう、 「もし1年続いていたら」 の状態を配布しています。
1. 動的にフォルダを作る
月別フォルダは事前に作らない — GAS で必要なときに作る
2. 今月分だけ整理
全部まとめて移さない — 1ヶ月分だけ 検索して移動する
3. 月1トリガー
毎月自動で走らせて、 溜まったバックアップを放置しない
検索と formatDate は準備運動3で触りました。 ワークでは moveTo と トリガー を足していきます。
まず — 手動で6月分が移動すればOK
準備運動3と同じ型で、 整理対象を バックアップ蓄積 に変えて6月分が移るまで。
▶ 実行 で、 バックアップ蓄積から6月分が移るまで
次に — 月1トリガーで自動化
手動実行が動いたら、 月1トリガー を設定。 第9回と同じく、 まず1分トリガーで確認してから月1に切り替えます。
提出目標はトリガー設定まで
具体的な書き方はスライドでは載せません — 第9回のコード・指示書・AI相談・チューターで。 手動実行で止まった人も、 トリガー設定から進められます。
日本語の指示書を書く順番に、 4問を並べています。 自分なりに答えてみましょう。
formatDate + title contains をそのまま使う?)
2026-06? 2026年06月? 並んで見やすい形式は?)
正解は1つではありません。 なぜそうしたか を自分の言葉で説明できることが大事です。
今回の新しい道具
mimeType contains "image/")title contains "議事")formatDate + createFolder + moveTo(月別フォルダへ移動)
folder.searchFiles('条件') — フォルダ内のファイルを検索files.hasNext() / files.next() — 検索結果のループbaseFolder.createFolder('名前') — 新しいフォルダを作る第8・9回からの道具 (ワークでも使う)
DriveApp.getFolderById('...') / file.moveTo(folder)new Date() / Utilities.formatDate(..., 'yyyy-MM')5人1組のグループ に分かれて、 Notion ページ (ここをクリックして開いて自分のページに移動してね) に沿って 日本語で指示書 → GAS実装 → 動作確認 の順で進めましょう!
15分
個人作業
Step1 — 日本語で指示書
60分
チューター回遊
指示書 + コードをチェック
15分
提出
共有URL発行
あなた
日本語で指示書 → GAS翻訳 → 動作確認 → 提出チューターさん
各グループを 回遊。 指示書もコードもまとめて見てくれる小菅さん
常に色々回って合間を埋める。 詰まったら声かけてOK指示書を Google Apps Script に翻訳する
ワークで書いた日本語の指示書を、 GAS のコードに1行ずつ翻訳していきます。 1コマ目の searchFiles + 第8・9回の道具 を組み合わせて、 月別整理の関数を組み立ててください。
organizeBackups)。 準備運動の myFunction は
そのまま残して、 その下に 新しい関数を作って 書いていきます
バックアップ蓄積 に変えて6月分が移るまで。 次に —
月1トリガーを設定(第9回と同じ要領で1分トリガーで確認 → 月1に切り替え)
今日は AI相談OK です。 1コマ目で道具の触り方を体験したので、 ここからは 「組み合わせを AI に相談しながら作る」 段階に進みます。
ただし「丸投げ」 は NG
AI に投げたやり取りは、 後で 共有URL を提出物として出してもらいます。 自分の問いかけが綺麗に出ているかも見てください。
次回までの課題と提出物
今日の提出対象は以下の通りです
10_20260611 フォルダの中身)共有URL を発行し、 URLを課題提出フォームから提出してください。

手順