第9回 アルゴリズム概論
2026.06.04
ブラウザの使い分けについて
Phase2の講義は、 Chrome の 「通常モード」 と 「シークレットモード」 の 2つ を同時に開いて、 用途で使い分けます。
Google ドライブ / Apps Script
今日の 作業はこっち
Google Meet (この講義)
Meet入室は こっち
※ Drive や GASエディタを シークレットモードで開かない ように注意 — シークレットモードはGoogleアカウントにログインしていないので、 今日の作業ファイルが見えません。ChatGPTなどのAIツールも通常のChromeで開くようにしてください!
先にここを揃えてから今日の本題に入ります
Google Driveの中の「09_20260604」 フォルダの中に今日使う 3つのもの を揃えます。
09_20260604_gas を作る※ 保存先フォルダ (バックアップを置く場所) は、 ワークで 自分で決めて 用意します。 ここではまだ作りません。
ファイルの名前は09_20260604_gasにします
「09_20260604」 フォルダの中に、Google Apps Scriptファイルを1つ作ります。
09_20260604_gas に設定
ファイルの名前は「テスト用Docs」にします
「09_20260604」 フォルダの中に、Google ドキュメントを1つ作ります。 これが今日の卒論原稿として想定するファイル (中身は空でOK)。
「09_20260604」 フォルダの中に、Google スプレッドシートを1つ作ります。 そして1行目に見出しを設定します。
ファイル名は「バックアップ履歴」にします
Drive で 「09_20260604」 を開くと、 こんな見た目になっているはず。 違っていたらここで直しておきましょう。
変数を改めてつかもう
先週のみなさんのNotion入力内容を見ていて、 こんな書き方を多く見かけました。
よくある書き方の例
日付_ファイル名 に変える日付_ファイル名 に変える」

未来の自分・他人・AI — 誰が読んでも 同じ理解にたどり着ける書き方を意識!
毎回「1で複製したファイル」 と書くのは長くて もったいない。 そこで 1度だけ 短い名前 を決めて、 以降はその名前で呼ぶことにします。
日付_ファイル名 に変える実はこれ、 みなさん 普段から無意識にやってる ことと同じ仕組みです。 → 次のスライドへ
「短い呼び名」 と 「中身 (長い名前)」 を つなぐ — みなさんも 日常で やってるはず。
日常
Mrs. GREEN APPLE
グループ内で 通じる 短い呼び名
コードで (今日のテーマ)
1で複製したファイル
自分とコンピューターの間で 通じる 短い呼び名
この 「ニックネームをつけて、 後で短く呼ぶ」 が、 コードでいう 変数。
元ファイルを触ってしまうコード
file.makeCopy();
file.setName(backupName);
file.moveTo(backupFolder);
file は元のファイルのまま。
卒論本体の名前が変わって、移動してしまう
コピーを名前付きで使うコード
const copy = file.makeCopy(); // コピーと呼ぶ
copy.setName(backupName); // コピーの名前を変える
copy.moveTo(backupFolder); // コピーを移動する
copy = コピー (= 1で複製したファイル)
→ 安全に名前変更 → 安全に移動
日本語で 「コピー」 という ニックネーム をつけることが、 コードでは const copy = ... にあたります。
日本語で言うと
1で複製したファイルに
「コピー」 という ニックネームをつける
コードで言うと
const copy = file.makeCopy();
この 「ニックネームをつけておく」 考え方が、 コードでは 変数 になります。
今日の新しい道具を1つずつ触ってみよう
「バックアップ履歴」 シートに、 今日の日付 / ファイル名 / 空のコメント の 1行を、 GAS で追記してみます。
Before — 実行する前
| 日付 | ファイル名 | コメント |
|---|---|---|
| (空) | (空) | (空) |
After — 実行したあと
| 日付 | ファイル名 | コメント |
|---|---|---|
| 20260604 | テスト用Docs | (空) |
まずは 動かす感覚 をつかむために、 固定の文字列 を渡して1行追記してみます。
SpreadsheetApp.openById('履歴シートID').getActiveSheet()
バックアップ履歴シート を
.
appendRow(["20260604", "バックアップ", ""])
この3つの値で1行追加する
appendRow に渡すのは 値の配列。 まずは 固定の文字列 を入れて、 シートに書ける感覚を確かめましょう。
GASエディタの myFunction の中に、 以下のコードを書きましょう。
function myFunction() {
const logSheet = SpreadsheetApp.openById("バックアップ履歴のID").getActiveSheet();
logSheet.appendRow(["20260604", "テスト用Docs", ""]);
}
コード中の バックアップ履歴のID の部分は、 自分が作ったシートの ID に置き換えましょう
(IDの確認方法はここをクリックして見てね)
バックアップ履歴シート を開いて、 変化を確認しましょう。
ただし — "20260604" を直書きしているので、 いつ実行しても記録される日付は20260604のまま になります。
ここを次の Stage で「記録した日の日付を入力できる(動的)」します。
第8回で覚えた `formatDate` を使えば、 「今日の日付」 を自動で取れます。
new Date()
今の日時を作る
→
Utilities.formatDate(today, 'JST', 'yyyy-MM-dd')
「yyyy-MM-dd」 形に整える
const today = new Date() で 今の日時を作って、 formatDate で文字列に整えると、 "20260604" 相当の値が得られます。
Stage 1 のコードを書き換えて、 日付を formatDate で動的に取れるようにします。 保存 → 実行 しましょう。
function myFunction() {
const today = new Date();
const dateStr = Utilities.formatDate(today, "JST", "yyyy-MM-dd");
const logSheet = SpreadsheetApp.openById("バックアップ履歴のID").getActiveSheet();
logSheet.appendRow([dateStr, "テスト用Docs", ""]);
}
黄色のところ が Stage 1 から 変わった/追加された部分。 固定値 "20260604" が変数 dateStr に置き換わっただけ。
シートを開くと、 2行目 が追加されているはず。
明日もう一度実行すれば、 自動的に「2026-06-05」 で1行追加されます。
formatDate の 3つ目の引数 (フォーマット文字列) を変えるだけで、 取れる粒度が変わります。
準備運動でやったやつ — 日付のみ
Utilities.formatDate(today, "JST", "yyyy-MM-dd")
→ "2026-06-04"
時刻まで欲しいなら
Utilities.formatDate(today, "JST", "yyyy-MM-dd HH:mm:ss")
→ "2026-06-04 02:00:15"
ワークの履歴シートで 時刻まで残したい人 は、 ここを応用すればOK。 ファイル名は日付のみ / シートには時刻まで、 のように 用途で粒度を変える 使い分けも可能です。
さっきは 「▶ 実行」 を 自分で押して 動かしていました。
今度は 「設定した時刻になると 自動で走る」 仕組み (= トリガー) を試します。
GASエディタの 左サイドバーから 「トリガー」 (時計アイコン) をクリックして、 トリガー設定の画面を開きます。
トリガー画面が開きます。 「新しいトリガーを作成します」 のリンク or 右下の 「+ トリガーを追加」 ボタン、 どちらかをクリックしてください。
「時間単位で自動実行」 したいので、 ほとんどの設定はデフォルトのまま で大丈夫です。
実行する関数 — myFunction
実行するデプロイ — Head
イベントのソース — 時間主導型
上の 2箇所だけ 変更して、 下の 「保存」 をクリックします。
時間ベースのトリガーのタイプ — 分ベースのタイマー
時間の間隔を選択 (分) — 1分おき
本来は「毎日 X時」 のような長い間隔で設定しますが、 今は 動作確認のため 1分おき にします。
トリガーを保存したら、 何もしないで バックアップ履歴シートを開いて待ちます。 1分後くらいに、 シートに新しい1行が追加されるはず。
確認できたら、 必ず このトリガーを削除 します (放っておくと永遠に1分おきに走り続けます)。 次のスライドで削除手順を確認しましょう。
トリガー一覧で、 削除したい行の 右端の「⋮」 をクリック → メニューから 「トリガーを削除」 を選びます。
「完全に削除しますか?」 の確認モーダルが出ます。 右下の 「完全に削除」 をクリックしてください。
※ 削除しないと 1分おきに走り続けて、 履歴シートの行が無限に増えていきます。 必ず削除を。
ワークに集中する前に、 準備運動の痕跡を片付けます。
第8回で作った「バックアップを取る仕組み」 を、 今日はさらに強化します。
第8回のバックアップは、 こんな弱点を抱えていました:
これを解決するために、 今日は 「自動で動く」 + 「いつ何をしていたかをシートに残す」 を1つの仕組みに統合します。
1.自動で動かす
毎日自動で実行して、バックアップの取り忘れを防ぐ
例
毎日 深夜2時に 勝手に走る
2.バックアップ時刻を記録
どの時点のバックアップなのか、後から分かるようにする
例
2026-06-04 02:00:15
3. コメント欄の用意
その時点で何をしていたかを、後から書き残せるようにする
例
「序章の構成変えた」
どんな仕組みなら、あとで見返しやすく、続けやすいでしょうか。 以下の4つを、自分なりに決めてみましょう。
正解は1つではありません。 なぜそのルールにしたのか を説明できることが大事です。
今回の新しい道具
SpreadsheetApp.openById('...').getActiveSheet() — シートを取ってくるsheet.appendRow([...]) — シートに 1行追記する第8回からの道具 (バックアップ用)
DriveApp.getFileById('...') / DriveApp.getFolderById('...')file.makeCopy() / file.setName('...') / file.moveTo(folder)new Date() / Utilities.formatDate(today, 'JST', 'yyyy-MM-dd')const ... = ... (変数)5人1組のグループ に分かれて、 Notion ページ (ここをクリックして開いて自分のページに移動してね) に沿って 日本語で指示書 → GAS実装 → 動作確認 の順で進めましょう!
作業開始
日本語で指示書 → GAS実装
チューターさんチェック
指示書・コード を見てもらう
提出
共有URL発行
あなた
日本語で指示書 → GAS翻訳 → 動作確認 → 提出チューターさん
各グループを 回って 指示書 や コードを見てくれる小菅さん
常に色々回って合間を埋める。 詰まったら声かけてOK指示書を Google Apps Script に翻訳する
ワークで書いた日本語の指示書を、 GAS のコードに 1行ずつ翻訳していきます。 第8回の道具 + 今日の新道具 を組み合わせて、 自動バックアップ + 履歴記録の関数を組み立ててください。
dailyBackup)。 準備運動で動かした myFunction は そのまま残して、 その下に 新しい関数を作って 書いていきます。 動いたものを消さずに済むので、 つまずいても安心です第8回で道具の触り方を1つずつ体験したので、 今日はAI相談を非推奨にはしません
ただし「丸投げ」 は NG
次回までの課題と提出物
今日の提出対象は以下の通りです
共有URL を発行し、 URLを課題提出フォームから提出してください。

手順
フォルダごと共有することで、 講師・チューターが GASコード + 履歴シート + バックアップファイル + トリガー設定 を全部見られます。