バックアップシステムを強化する

第9回 アルゴリズム概論

2026.06.04

はじめに

ブラウザの使い分けについて

準備

Chrome を 「2つ」 開いて使い分けます

Phase2の講義は、 Chrome の 「通常モード」 と 「シークレットモード」 の 2つ を同時に開いて、 用途で使い分けます。

通常のChrome

Google ドライブ / Apps Script

今日の 作業はこっち

シークレットモード

Google Meet (この講義)

Meet入室は こっち

※ Drive や GASエディタを シークレットモードで開かない ように注意 — シークレットモードはGoogleアカウントにログインしていないので、 今日の作業ファイルが見えません。ChatGPTなどのAIツールも通常のChromeで開くようにしてください!

今日の準備

先にここを揃えてから今日の本題に入ります

準備

下準備の全体像

Google Driveの中の「09_20260604」 フォルダの中に今日使う 3つのもの を揃えます。

  1. GASファイル 09_20260604_gas を作る
  2. 「テスト用Docs」 (Google ドキュメント) を作る
  3. 「バックアップ履歴」 (Google スプレッドシート) を作る

※ 保存先フォルダ (バックアップを置く場所) は、 ワークで 自分で決めて 用意します。 ここではまだ作りません。

手順1

GASファイル「09_20260604_gas」 を作る

ファイルの名前は09_20260604_gasにします

「09_20260604」 フォルダの中に、Google Apps Scriptファイルを1つ作ります。

  1. 「09_20260604」 フォルダをダブルクリックで開く
  2. 「新規」 → 「その他」 → 「Google Apps Script」 をクリック
  3. ファイル名を 09_20260604_gas に設定
手順2

「テスト用Docs」 を作る

ファイルの名前は「テスト用Docs」にします

「09_20260604」 フォルダの中に、Google ドキュメントを1つ作ります。 これが今日の卒論原稿として想定するファイル (中身は空でOK)。

  1. 「09_20260604」 フォルダをダブルクリックで開く
  2. 「新規」 → 「Google ドキュメント」 をクリック
  3. ファイル名を 「テスト用Docs」 に設定
  4. (自由に1〜2行、 本文に文字を入れてもOK)
手順3

「バックアップ履歴」 シートを作る

「09_20260604」 フォルダの中に、Google スプレッドシートを1つ作ります。 そして1行目に見出しを設定します。

ファイル名は「バックアップ履歴」にします

  1. 「09_20260604」 フォルダをダブルクリックで開く
  2. 「新規」 → 「Google スプレッドシート」 をクリック
  3. ファイル名を 「バックアップ履歴」 に設定
  4. 1行目に見出しを書いてください — A1「日付」 / B1「ファイル名」 / C1「コメント」
確認

準備の完成形

Drive で 「09_20260604」 を開くと、 こんな見た目になっているはず。 違っていたらここで直しておきましょう。

マイドライブ › 2026アルゴリズム概論 › 09_20260604
名前 ↑
09_20260604_gas
⋮
テスト用Docs
⋮
バックアップ履歴
⋮

変数について

変数を改めてつかもう

振り返り

先週のワークで気づいたこと

先週のみなさんのNotion入力内容を見ていて、 こんな書き方を多く見かけました。

よくある書き方の例

  1. テスト用Docs のファイルを複製する
  2. ファイルの名前を 日付_ファイル名 に変える
  3. ファイルを backup フォルダに移動する
振り返り

解釈が人によって分かれる 可能性がある表現

「2. ファイルの名前 を 日付_ファイル名 に変える」
振り返り

解釈ミスがあると、 こんな 事故 が起きる

振り返り

何を示すのかを常に明示 しよう

未来の自分・他人・AI — 誰が読んでも 同じ理解にたどり着ける書き方を意識!

振り返り

「1で複製したファイル」 に 名前 をつける

毎回「1で複製したファイル」 と書くのは長くて もったいない。 そこで 1度だけ 短い名前 を決めて、 以降はその名前で呼ぶことにします。

  1. テスト用Docs のファイルを複製する
  2. 1で複製したファイル → 「コピー」 と呼ぶことにする
  3. コピー の名前を 日付_ファイル名 に変える
  4. コピー を backup フォルダに移動する

実はこれ、 みなさん 普段から無意識にやってる ことと同じ仕組みです。 → 次のスライドへ

振り返り

これは ニックネーム と同じ仕組み

「短い呼び名」 と 「中身 (長い名前)」 を つなぐ — みなさんも 日常で やってるはず。

日常

「ミセス」
↓

Mrs. GREEN APPLE

グループ内で 通じる 短い呼び名

コードで (今日のテーマ)

「コピー」
↓

1で複製したファイル

自分とコンピューターの間で 通じる 短い呼び名

この 「ニックネームをつけて、 後で短く呼ぶ」 が、 コードでいう 変数。

振り返り

指示の書き方によるコンピューターの解釈の違い・Before

振り返り

指示の書き方によるコンピューターの解釈の違い・After

振り返り

コードに翻訳すると、こんな違いになる

元ファイルを触ってしまうコード

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 — シートに 1行追記してみる

「バックアップ履歴」 シートに、 今日の日付 / ファイル名 / 空のコメント の 1行を、 GAS で追記してみます。

Before — 実行する前

バックアップ履歴
日付 ファイル名 コメント
(空) (空) (空)
→

After — 実行したあと

バックアップ履歴
日付 ファイル名 コメント
20260604 テスト用Docs (空)
準備運動

GAS に翻訳 — まずは固定値で動かす

まずは 動かす感覚 をつかむために、 固定の文字列 を渡して1行追記してみます。

SpreadsheetApp.openById('履歴シートID').getActiveSheet()

バックアップ履歴シート を

.
appendRow(["20260604", "バックアップ", ""])

この3つの値で1行追加する

appendRow に渡すのは 値の配列。 まずは 固定の文字列 を入れて、 シートに書ける感覚を確かめましょう。

準備運動

翻訳内容をエディタに書く (Stage 1)

GASエディタの myFunction の中に、 以下のコードを書きましょう。

function myFunction() {
  const logSheet = SpreadsheetApp.openById("バックアップ履歴のID").getActiveSheet();
  logSheet.appendRow(["20260604", "テスト用Docs", ""]);
}

コード中の バックアップ履歴のID の部分は、 自分が作ったシートの ID に置き換えましょう
(IDの確認方法はここをクリックして見てね)

保存 (Cmd + S) → ▶ 実行。 初回実行時は 権限承認 が出ます
手順は 第8回スライドの権限承認のページ を参照してください。
準備運動

動作確認 (Stage 1) — シートに 1行追加されましたか?

バックアップ履歴シート を開いて、 変化を確認しましょう。

シートに 「20260604 / テスト用Docs / (空)」 の 1行 が増えていれば 大成功!

ただし — "20260604" を直書きしているので、 いつ実行しても記録される日付は20260604のまま になります。 ここを次の Stage で「記録した日の日付を入力できる(動的)」します。

復習

日付を動的にしよう — 先週の道具を思い出そう

第8回で覚えた `formatDate` を使えば、 「今日の日付」 を自動で取れます。

new Date()

今の日時を作る

→
Utilities.formatDate(today, 'JST', 'yyyy-MM-dd')

「yyyy-MM-dd」 形に整える

const today = new Date() で 今の日時を作って、 formatDate で文字列に整えると、 "20260604" 相当の値が得られます。

準備運動

翻訳内容をエディタに書く (Stage 2)

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 に置き換わっただけ。

準備運動

動作確認 (Stage 2) — 動的な日付になっていますか?

シートを開くと、 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。 ファイル名は日付のみ / シートには時刻まで、 のように 用途で粒度を変える 使い分けも可能です。

準備運動

準備運動2 — トリガーで 自動実行する

さっきは 「▶ 実行」 を 自分で押して 動かしていました。
今度は 「設定した時刻になると 自動で走る」 仕組み (= トリガー) を試します。

今回は コードは触りません。 GASエディタの トリガー画面 を触って、 設定するだけ。
手順1

左サイドバーの 「トリガー」 をクリック

GASエディタ左サイドバーの トリガー(時計アイコン)

GASエディタの 左サイドバーから 「トリガー」 (時計アイコン) をクリックして、 トリガー設定の画面を開きます。

手順2

「+ トリガーを追加」 をクリック

トリガー画面(空)で 新しいトリガーを作成 リンク または +トリガーを追加 ボタン

トリガー画面が開きます。 「新しいトリガーを作成します」 のリンク or 右下の 「+ トリガーを追加」 ボタン、 どちらかをクリックしてください。

手順3

ダイアログが開く — デフォルトのままでほぼOK

トリガー追加ダイアログ(デフォルト状態)

「時間単位で自動実行」 したいので、 ほとんどの設定はデフォルトのまま で大丈夫です。

実行する関数 — myFunction

実行するデプロイ — Head

イベントのソース — 時間主導型

手順4

「分ベースのタイマー」 / 「1分おき」 に変更 → 保存

時間ベースのタイマーを 分ベース に変更、 1分おき に設定

上の 2箇所だけ 変更して、 下の 「保存」 をクリックします。

時間ベースのトリガーのタイプ — 分ベースのタイマー

時間の間隔を選択 (分) — 1分おき

本来は「毎日 X時」 のような長い間隔で設定しますが、 今は 動作確認のため 1分おき にします。

準備運動

動作確認 — 自動で動きますか?

トリガーを保存したら、 何もしないで バックアップ履歴シートを開いて待ちます。 1分後くらいに、 シートに新しい1行が追加されるはず。

「自分が ▶ を押してないのに、 勝手にシートに行が増えた!」
これがトリガーで自動実行された体験です。

確認できたら、 必ず このトリガーを削除 します (放っておくと永遠に1分おきに走り続けます)。 次のスライドで削除手順を確認しましょう。

削除1

「⋮」 メニュー → 「トリガーを削除」

トリガー一覧の右端 ⋮ メニューから トリガーを削除

トリガー一覧で、 削除したい行の 右端の「⋮」 をクリック → メニューから 「トリガーを削除」 を選びます。

削除2

確認モーダルで 「完全に削除」

完全に削除しますか? の確認モーダル

「完全に削除しますか?」 の確認モーダルが出ます。 右下の 「完全に削除」 をクリックしてください。

※ 削除しないと 1分おきに走り続けて、 履歴シートの行が無限に増えていきます。 必ず削除を。

ワーク

整理

ワーク前の整理 — 準備運動の後片付け

ワークに集中する前に、 準備運動の痕跡を片付けます。

  1. 準備運動2 で設定した「1分ごと」 のトリガーを削除 — 放置すると永遠に走り続けます (トリガー画面で当該行の右の「⋮」 → 「削除」)
  2. 履歴シートは 1行目 (見出し) だけ残して、 他の行は全部削除
お題

今日のお題 — バックアップシステムをさらに強化しよう

第8回で作った「バックアップを取る仕組み」 を、 今日はさらに強化します。

目的
いつバックアップが取られたのか / その時点で何をしていたのかをしっかり記録することで、 後から見たときに いつでも誰でも思い出せる状態 にする
お題

なぜ強化が必要か

第8回のバックアップは、 こんな弱点を抱えていました:

  • バックアップを忘れる可能性 — 自分でボタン押して実行しないと、バックアップはされない
  • 日毎の違いが不明瞭 — ファイルを開かないとファイルごとの違いがわからない

これを解決するために、 今日は 「自動で動く」 + 「いつ何をしていたかをシートに残す」 を1つの仕組みに統合します。

お題

強化の3つの中身

1.自動で動かす

毎日自動で実行して、バックアップの取り忘れを防ぐ

例

毎日 深夜2時に 勝手に走る

2.バックアップ時刻を記録

どの時点のバックアップなのか、後から分かるようにする

例

2026-06-04 02:00:15

3. コメント欄の用意

その時点で何をしていたかを、後から書き残せるようにする

例

「序章の構成変えた」

お題

自分のバックアップルールを決める

どんな仕組みなら、あとで見返しやすく、続けやすいでしょうか。 以下の4つを、自分なりに決めてみましょう。

  1. バックアップファイルの名前をどうする?
    例: 日付だけ / 日付+元のファイル名 / 並べたときに分かりやすい順番
  2. どのフォルダに保存する?
    例: 先週の backup フォルダ / 新しく作ったフォルダ / 自分が見つけやすい場所
  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 は そのまま残して、 その下に 新しい関数を作って 書いていきます。 動いたものを消さずに済むので、 つまずいても安心です
  • 1個書いたら 「▶ 実行」 で動きを確認 → Drive と バックアップ履歴シート を見にいく
  • トリガーを設定するのは 動作確認が終わってから。 まずは ▶ 実行 で 関数が完成しているか確かめる
大事なこと

AI相談について — 今日は OK

第8回で道具の触り方を1つずつ体験したので、 今日はAI相談を非推奨にはしません

ただし「丸投げ」 は NG

  • まず 自分で日本語の指示書を書く (ワークの Step1) — これは自分でやる
  • その上で「この日本語を GAS に翻訳するには?」 を AI に相談 — OK
  • 「いい感じのバックアップ仕組み作って」 みたいな丸投げは ✕

提出物について

次回までの課題と提出物

やること

やること

今日の提出対象は以下の通りです

  • GASコード + 履歴シート + 動いてるトリガー (= 09_20260604 フォルダの中身)
  • Notionページの内容 (自分の指示書 / コードのメモ / 振り返り)
提出方法

GASコードは — 「フォルダの共有URL」 で提出

共有URL を発行し、 URLを課題提出フォームから提出してください。

手順

  1. Drive で 「09_20260604」 フォルダを右クリック → 「共有」 → 「共有」
  2. 「一般的なアクセス」 を 「リンクを知っている全員」 に変更
  3. 役割は 「閲覧者」 のままでOK
  4. 「リンクをコピー」 をクリックして提出

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

以上! おつかれさまでした!