AppleScript 七つ道具 〜 Mac 上の反復入力は簡単に自動化できる。

#**イントロダクション**

**前提**

- この記事は、Mac ユーザー向けです。
- 使用マシンは、macOS Catalina バージョン 10.15.1 です。

**背景/課題**

- PC を使っていると、大量のデータを反復入力せざるを得ない場面はありませんか？
- たとえば、Web アプリケーションに、エクセルのデータを、今週中に数百件入力しなければならない。。。考えるだけでうんざりします。腹をくくって、さあやるぞ！と始めても、途中で投げ出したくなること必至ではないでしょうか。
- 「**あ〜〜、もうめんどくさっ！！**」と思ったら、**良い方法**があります。

**解決策**

- **その課題、AppleScript で解決できます！**
- AppleScript は macOS に同梱されている基本ソフトです。つまりマックユーザーなら誰でも使用可能なアプリです。知名度はあまり高くないかも知れません。(私自身数ヶ月前に知りました。)
- AppleScript は、アプリの呼び出し、キーボード入力、処理の分岐と繰り返し、などを記述できる言語です。つまり、キーボードからの入力を完全にコード化でき、記述された通りに自動実行させることができるということです。

**この文書の内容**

- この文書では、AppleScript の基本操作を「**AppleScript 七つ道具**」としてご紹介します。
- また、その「七つ道具」を使って、実際に動くサンプルのスクリプトを作成します。

**この文書の目的**

- **AppleScript は繰り返しの作業を自動実行するために活用できます！**
- 習得は容易で、基本操作を覚えれば、一通りの操作はできるようになります。
- このページを参照した方が、これまで手作業でやっていた大量の反復作業 / 繰り返し作業を、AppleScript を使って、より速く、正確に、また快適にできるようになっていただければ嬉しいです。

#AppleScript の作成/実行環境を立ち上げる

- Mac OS にもともと入っているアプリ、スクリプトエディタを立ち上げてください。
 - スクリプトエディタは、AppleScript を記述 / 実行できるアプリです。
 - コードを記述して保存すると、.scp という拡張子のファイルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137475/fea447e6-65c1-4e2c-3a19-28aea06223b3.png)

- 立ち上がったら準備完了です！
- コーディングを始めて行きましょう！

#七つ道具を使ったサンプル

- では実際に「**AppleScript 七つ道具**」を使って、簡単なアプリケーション間処理を作成して行きましょう。
- Google グループへのメンバー登録を自動実行する AppleScript を作成します。

- 処理の流れはこのような感じです。
 - メーリスメンバーのメアドが入ったエクセルを開く
 - メアド、登録ステータス
 - Google グループの登録画面を開く
 - 登録処理を始める
 - エクセルで、登録ステータスをチェックし、未登録であればメンバー登録する
 - 登録したら、エクセルの登録ステータスを更新する

- 付記： これ自体は単純な処理で実際に使うことはあまりないかも知れません。実際には手で登録した方が早いと思います。ですが、エクセルの内容を Web に入力する型として、色々な処理パターンに応用できると思います。システムへの大量照会、登録/更新もその一例です。

#事前準備

- **エクセルファイルを作成します。**
 - Google グループに登録するメールアドレスを記載します。
 - ファイルは開いたままにしておきます。
 - 下記はサンプル画面です。（メールアドレスは例です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137475/bb1ee3c4-20f7-8174-4e7f-aef031b8d28d.png)

- **Google グループを作成します。**
 - ブラウザ上で、その登録ページを開いておきます。
 - 下記はサンプル画面です。（所有者のメールアドレスは伏せています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137475/6039f650-2acb-5cd9-c7ae-40b3b3eb7cf5.png)

#道具① アプリを呼び出す : tell

- まずは AppleScript でアプリケーション (以下アプリ) を呼び出してみましょう。
- アプリを呼び出すとは、そのアプリのウィンドウを最前面に表示させて操作可能にすることです。

**コードの説明**

- アプリを呼び出すコードはとても簡単です。これだけです！

```applescript:sample.scp
tell application "アプリケーション名" to activate
```

- では実際に AppleScript を自分で書いて実行してみましょう。
- まず Mac 同梱ソフトであるスクリプトエディタを起動します。
- スクリプトエディタは、AppleScript を記述して実行させることができるアプリです。

**コード実例**

- スクリプトエディタを起動したら、メニューバーから、ファイル、新規を選択します。
- 以下のようにコードを記述します。

```applescript:sample.scp
tell application "Google Chrome" to activate -- AppleScript Tool 1
tell application "Microsoft Excel" to activate -- AppleScript Tool 1
```
- -- 以降はコメントとなります。コードとして扱われません。
- 複数行をコメントしたい場合は、(* と *) で囲みます。

**稼働確認**

- AppleScript 実行前準備として、Microsoft Excel (以下 Excel) と Google Chrome (以下 Chrome) を起動させておきます。
- スクリプトエディタの実行ボタンを押します。
- 最初に Chrome、次に Excel の画面がアクティブになったら成功です！
- **１つ目の道具で、アプリケーションを呼び出すことができるようになりました。**

#道具② キーボード入力で操作する : key code

- 次に、呼び出したアプリ上で、キーボード入力をさせてみましょう。
- これができると、アプリ呼び出しと、キーボード入力ができることになり、トラックパッド (マウス) 以外の全てのユーザーインプットをコード (プログラム) で表現できるようになります。
- そしてコード化された操作は自動実行できます。

**コードの説明**

- キーボード入力はこのように記述します。

```applescript:sample.scp
tell application "System Events"
key code XX   -- (*) XX に Key Code の番号を入れます。
end tell
```

- Key Code とは Mac キーボードの各ボタンに割り当てられた番号です。こちらのマッピング図が便利です。
 - Complete list of AppleScript key codes
 - https://eastmanreference.com/complete-list-of-applescript-key-codes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137475/3f3e8464-aa13-c6bd-49f6-0d175132645e.png)


- よく使うものを挙げてみました。

```applescript:sample.scp
-- タブ
key code 48 -- tab
-- リターン
key code 36 -- return
-- エスケープ
key code 53 -- escape
-- スペース
key code 49 -- tab

-- カーソル移動
key code 123 -- left
key code 124 -- right
key code 125 -- down
key code 126 -- up

-- command + ?
key code {55, 0} -- command + A, 全て選択
key code {55, 1} -- command + S, 保存
key code {55, 3} -- command + F, 検索
key code {55, 5} -- command + G, 置換
key code {55, 6} -- command + Z, 元に戻す
key code {55, 7} -- command + X, 切り取り
key code {55, 8} -- command + C, コピー
key code {55, 9} -- command + V, ペースト
key code {55, 13} -- command + W, 画面を閉じる
key code {55, 35} -- command + P, プリント
 
-- その他
key code 124 using shift down -- shift + right
```

**コーディング実例**

- 下記のコードは、エクセルのメアドのセルをコピーして、別のセルへペーストするものです。

<details><summary>道具② のサンプルコード</summary><div>

（このコードは 道具① に 道具② を追加したものです）

```applescript:AppleScript_Tool2.scp

tell application "Microsoft Excel" to activate -- AppleScript Tool 1

tell application "System Events" -- AppleScript Tool 2
	key code {55, 8} -- command + C、メールアドレスをコピー
	key code 124 -- right、カーソル移動
	key code 124 -- right
	key code {55, 9} -- command + V、メルアドレスをペースト
end tell
```
</div></details>

**稼働確認**

- 実行してみましょう！
- **エクセル上のメアドが、別のセルにコピーされたら成功です！**


#道具③ 任意の文字列を検索する : clipboard

- 次は、Web 画面での入力です。
- まず、入力したい項目にカーソルを移動する必要があります。
- ブラウザの検索機能を利用して、Web 画面上の任意の項目に移動する処理を作成します。

**コードの説明**

- 具体的な手順はこのようにします。
- Web ブラウザをアクティブ化し、command + f を押します。
- 検索画面が表示されるので、そこに検索する値を入力します。
- その際 AppleScript の clipboard (変数) を使うと便利です。clipboard に値を入れると、OS のクリップボードに値が入ります。

**コーディング実例**

- ブラウザに表示された Google グループの "メンバーを追加" ボタンを押下します。

<details><summary>道具③ のサンプルコード</summary><div>

（このコードは 道具① に 道具③ を追加したものです）

```applescript:AppleScript_Tool3.scp
tell application "Google Chrome" to activate -- AppleScript Tool 1

tell application "System Events" -- AppleScript Tool 2
	-- Web ページで "メンバーを追加" を検索する
	set the clipboard to "メンバーを追加" -- AppleScript Tool 3
	delay 1
	key code {55, 3} -- command + F
	delay 1
	key code {55, 9} -- command + V, clipboard の値がペーストされる
	delay 1
	key code 36 -- return
	delay 1
	key code 53 -- escape
	delay 1
	key code 49 -- space
	-- メンバーを追加する
end tell
```
</div></details>

- ここで delay というコードが登場しています。
      - delay は AppleScript 実行を一時止める機能です。
      - delay n   (*) n には数字が入ります。
      - 前の処理が完了する前に次の処理を実行しないように調節のため使用します。
      - 最初は各処理の後ろに delay 1 を一律入れておけば良いかと思います。
      - 慣れて来たら delay を減らしたりして "チューニング" すると、処理がより高速になります。

**稼働確認**

- **Web ページ上で、Google グループの "メンバーを追加" を押下できました。**

#道具② と 道具③ を合わせる。

- ここで、道具③ の後に、道具② を追加して、Google グループの処理に、エクセルの処理をつなげます。
- さらにその後ろに、エクセルから取得したメールアドレスを、Google グループの新規メンバーに登録する操作を追加します。

**コーディング実例**

- AppleScript のコードはこのようになります。

<details><summary>道具②+③ のサンプルコード</summary><div>

（このコードは 道具①、道具②、道具③ からなります）

```applescript:AppleScript_Tool2+3.scp
tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	
	-- Web ページで "メンバーを追加" を検索する
	set the clipboard to "メンバーを追加" -- AppleScript Tool 3
	delay 1
	key code {55, 3} -- command + F
	delay 1
	key code {55, 9} -- command + V,、clipboard の値がペーストされる
	delay 1
	key code 36 -- return
	delay 1
	key code 53 -- escape
	delay 1
	key code 49 -- space、"メンバーを追加" ボタンを押す
	delay 1
	
end tell

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	key code {55, 8} -- command + C、メールアドレスをコピー
	delay 1
	--key code 124 -- right
	--key code 124 -- right
	--key code {55, 9} -- command + V
end tell

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	-- メンバーを追加する
	key code {55, 9} -- command + V、メールアドレスをペースト
	delay 1
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	delay 1
	key code 49 -- space、"メンバーを追加" ボタンを押す
	delay 1
end tell
```
</div></details>

**コードの説明**

- 処理の流れはこのようになります。
      - まず、Google クロームを開き、Google グループの "メンバーを追加" ボタンを押下します。
      - 次に、エクセルのメアドをコピーします。
      - 最後に、Google グループの新しいメンバーにメアドをコピーして、新規登録します。

**稼働確認**

- **エクセルから取得したメールアドレスを、Google グループの新規メンバーに登録することができました。**

#道具④ 処理を条件分岐させる : if

- 条件によって処理を分岐させることができれば、更に便利です。

####コードの説明④-1 : if

- AppleScript でも条件分岐が書けます。

```applescript:sample.scp
if 変数 is equal to "値１" then
        処理 xxx
    else if (the clipboard) is "値２" then
        処理 yyy
    else
end if
```

####コードの説明④-2 : clipboard

- クリップボードにコピーした値を条件にすることもできます。(これが結構使えます)

```applescript:sample.scp
set the clipboard to "xxx"
if 変数 is equal to "値１" then
        処理 xxx
    else if (the clipboard) is "値２" then
        処理 yyy
    else
end if
```

####コードの説明④-3 : display dialog

- ポップアップ画面を表示させることができます。
- display dialog "文字列" のように記述すると、その文字列の画面が表示されます。

**コーディング実例**

- このコードを適用して、エクセルの列の値を条件にして、処理を変えてみましょう。
- 以下のコードでは、グループに登録済みであれば処理をスキップし、未登録であればメンバー登録する、という条件分岐にしています。

<details><summary>道具④ のサンプルコード</summary><div>

（このコードは 道具①、道具②、道具③、道具④ からなります）

```applescript:AppleScript_Tool4.scp
tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	
	set the clipboard to "" -- クリップボードの値をクリアする
	key code 124 -- right、カーソル移動
	delay 1
	key code {55, 8} -- command + C、登録済みステータスをコピー
	delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
	
end tell

-- Googleグループに登録済みか確認する
if (the clipboard) is equal to "added" then -- AppleScript Tool 4
	display dialog ("このメンバーは登録済みです") -- メッセージ画面を表示する
	error number -128 -- 処理を中断する
end if

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	-- Web ページで "メンバーを追加" を検索する
	set the clipboard to "メンバーを追加" -- AppleScript Tool 3
	delay 1
	key code {55, 3} -- command + F
	delay 1
	key code {55, 9} -- command + V、clipboard の値がペーストされる
	delay 1
	key code 36 -- return
	delay 1
	key code 53 -- escape
	delay 1
	key code 49 -- space、"メンバーを追加" ボタンを押す
	delay 1
	
end tell

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	
	set the clipboard to "" -- クリップボードの値をクリアする
	key code 123 -- left、カーソル移動
	delay 1
	key code {55, 8} -- command + C、メールアドレスをコピー
	delay 1
	
end tell

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
	-- メンバーを追加する
	key code {55, 9} -- command + V、メールアドレスをペースト
	delay 1
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	key code 48 -- tab
	delay 1
	key code 49 -- space、"メンバーを追加" ボタンを押す
	delay 1
end tell
```
</div></details>

**稼働確認**

- **未登録のメンバーだけが、Google グループにメンバー登録されたと思います。**

#道具⑤ 処理のまとまりを作る : on - end, my

- コードが少し長くなってきましたね。
- 処理をまとまりごとに整理すると、ぐっと見やすくなります。

####コードの説明⑤-1 : on, end

- on と end で括ると処理のまとまりにできます。これをハンドラーと言います。
- (*) xxx はハンドラーの名前です。任意の名前にすることができます。

```applescript:sample.scp
on xxx()
        処理 yyy
end xxx
```

####コードの説明⑤-2 : my

- on - end で括ると、括られた部分は実行されなくなります。
- そのハンドラーを実行させるには、my を使います。

```applescript:sample.scp
my xxx()
```

####コードの説明⑤-3 : keystroke

- また今回 keystroke 使ってみたいと思います。
- keystroke を使うと、任意の文字列を入力できます。
      - 固定値だけでなく変数も使える。
      - ただし日本語は入力できないようです。
      - keystroke を使う場合は、キーボード入力を英数入力にしておく必要があります。

```applescript:sample.scp
keystroke "xxxxx"
```

**コーディング実例**

- ハンドラーにまとめることで、コード内にある各処理の内容と、実行の順番が明確になりました。
- また、keystroke を使って、Google グループへの登録ステータスを、エクセルに入力するようにしました。


<details><summary>道具⑤ のサンプルコード</summary><div>

（このコードは 道具①、道具②、道具③、道具④、道具⑤ からなります）

```applescript:AppleScript_Tool5.scp
-- ハンドラーの実行指示、AppleScript Tool 5
my checkAdded() -- メンバーがGoogleグループに登録済みか確認する

-- 登録済みの場合
if (the clipboard) is equal to "added" then -- AppleScript Tool 4
	display dialog ("このメンバーは登録済みです") -- メッセージ画面を表示する
	return -- 処理を中断する		
end if

my pushAddMember() -- "メンバーを追加" の画面を表示させる
my copyMailAddress() -- エクセルのメールアドレスをコピーする
my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
my markRegistered() -- 登録済みを示すために added と追記する


on checkAdded() -- メンバーがGoogleグループに登録済みか確認する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 124 -- right、カーソル移動
		delay 1
		key code {55, 8} -- command + C、登録済みステータスをコピー
		delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
	end tell
	
end checkAdded

on pushAddMember() -- "メンバーを追加" の画面を表示させる
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- Web ページで "メンバーを追加" ボタンを検索する
		set the clipboard to "メンバーを追加" -- AppleScript Tool 3
		delay 1
		key code {55, 3} -- command + F
		delay 1
		key code {55, 9} -- command + V、clipboard の値がペーストされる
		delay 1
		key code 36 -- return
		delay 1
		key code 53 -- escape
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end pushAddMember


on copyMailAddress() -- エクセルのメールアドレスをコピーする
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 123 -- left、カーソル移動
		delay 1
		key code {55, 8} -- command + C、メールアドレスをコピー
		delay 1
	end tell
	
end copyMailAddress


on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- メンバーを追加する
		key code {55, 9} -- command + V、メールアドレスをペースト
		delay 1
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		key code 48 -- tab
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end addMember

on markRegistered() -- 登録済みを示すために added と追記する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code 124 -- right、カーソル移動
		delay 1
		keystroke "added" -- Googleグループ登録済みとして added と入力
		delay 1
	end tell
	
end markRegistered
```
</div></details>

**稼働確認**

- **ハンドラー (on-end, my) を使って、AppleScript のコードを見やすく整理することができました。**

#道具⑥ 処理を繰り返す : repeat

- いよいよコード化された処理を、繰り返して実行させます。
- これをすると処理をコード化した意味があります！

####コードの説明⑥-1 : repeat n times

- 処理を n 回実行させるコードです。
 - n には数字が入ります。
 - 固定値だけでなく変数も扱えます。
 - 変数の初期化は、set 変数 to 値 のようにします。
 - 変数はハンドラー内で有効です。複数のハンドラーをまたいで使用したい場合は、global 変数として宣言すれば OK です。例 global hensu

```applescript:sample.scp
repeat n times
        処理 xxx
repeat end
```

####コードの説明⑥-2 : repeat while

- ある条件を満たすまで、処理を繰り返させるコードです。
 - 条件は、ある変数がある値になるまで、という書き方をします。
 - このコード例では、変数としてクリップボードを利用しています。

```applescript:sample.scp
repeat while ((the clipboard) is not "xxx")
        処理 yyy
end repeat
```

**コーディング実例**

- このコードでは、repeat while, clipboard を利用して、エクセルからコピーした値がブランクになるまで処理を繰り返させています。
- また、repeat n times を利用して、８回実行していたタブ押下を一つにまとめています。

<details><summary>道具⑥ のサンプルコード</summary><div>

（このコードは 道具①、道具②、道具③、道具④、道具⑤、道具⑥ からなります）

```applescript:AppleScript_Tool6.scp
-- ハンドラーの実行指示、AppleScript Tool 5

my copyCell() -- エクセルのメールアドレスをコピーする

repeat while ((the clipboard) is not "") -- AppleScript Tool 6
	
	my checkAdded() -- メンバーがGoogleグループに登録済みか確認する
	
	-- 登録済みでない場合
	if (the clipboard) is not equal to "added" then -- AppleScript Tool 4	
		my pushAddMember() -- "メンバーを追加" の画面を表示させる
		my copyMailAddress() -- エクセルのメールアドレスをコピーする
		my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
		my markRegistered() -- 登録済みを示すために added と追記する
	end if
	
	my gotoNextMember() -- 次のメンバーの行に移る
	my copyCell() -- エクセルのメールアドレスをコピーする
	
end repeat


on copyCell() -- エクセルのメールアドレスをコピーする
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code {55, 8} -- command + C、メールアドレスをコピー
		delay 1
	end tell
	
end copyCell


on checkAdded() -- メンバーがGoogleグループに登録済みか確認する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 124 -- right、カーソル移動
		delay 1
		key code {55, 8} -- command + C、登録済みステータスをコピー
		delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
		
	end tell
	
end checkAdded


on pushAddMember() -- "メンバーを追加" の画面を表示させる
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- Web ページで "メンバーを追加" ボタンを検索する
		set the clipboard to "メンバーを追加" -- AppleScript Tool 3
		delay 1
		key code {55, 3} -- command + F
		delay 1
		key code {55, 9} -- command + V、clipboard の値がペーストされる
		delay 1
		key code 36 -- return
		delay 1
		key code 53 -- escape
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end pushAddMember


on copyMailAddress() -- エクセルのメールアドレスをコピーする
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 123 -- left、カーソル移動
		delay 1
		key code {55, 8} -- command + C、メールアドレスをコピー
		delay 1
		
	end tell
	
end copyMailAddress


on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- メンバーを追加する
		key code {55, 9} -- command + V、メールアドレスをペースト
		delay 1
		repeat 8 times
			key code 48 -- tab
		end repeat
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end addMember


on markRegistered() -- 登録済みを示すために added と追記する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code 124 -- right、カーソル移動
		delay 1
		keystroke "added" -- Googleグループ登録済みとして added と入力
		delay 1
	end tell
	
end markRegistered


on gotoNextMember() -- 次のメンバーの行に移る
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code 125 -- down
		key code 123 -- left
		delay 1
	end tell
	
end gotoNextMember
```
</div></details>

**稼働確認**

- **エクセルの最終行まで処理を繰り返すことができました。**

#道具⑦ マックに喋らせる : say

- いよいよ七つ目の道具です。最後はマックに喋らせてみましょう。

**コードの説明**

```applescript:sample.scp
say "こんにちは！Apple Script 七つ道具をよろしくお願いします！"
```

- これだけです！日本語 OK です。かなり流暢な日本語を話します。
- AppleScript に喋らせると俄然ロボットらしくなります (笑)。とは言え、喋らせるのは単なるお遊びではなく実際的な使い道があります。それは**処理報告**です。AppleScript に大量にデータ処理させる時、PC 画面の前でずっと監視する訳にはいきません。それでは自動化した意味がありません。。でも AppleScript が「沈黙」していると、処理がうまく行っているのか、エラー終了しているのか判別できません。
- repeat のタイミングで処理完了を報告させると良いです。また異常終了も報告させると良いです。**say は、AppleScript の実行状況を確認するためにとても便利なのです。**

**コーディング実例**

- 処理の要所要所で say を入れると良いかと思います。
- ここでは処理の開始時、メンバー登録時、完了時の３つのタイミングで、マックに喋らせています

<details><summary>道具⑦ のサンプルコード</summary><div>

（このコードは 道具①、道具②、道具③、道具④、道具⑤、道具⑥、道具⑦ からなります）

```applescript:AppleScript_Tool7.scp
-- ハンドラーの実行指示、AppleScript Tool 5

say "グーグルグループへのメンバー登録を始めます" -- AppleScript Tool 7

my copyCell() -- エクセルのメールアドレスをコピーする

repeat while ((the clipboard) is not "") -- AppleScript Tool 6
	
	my checkAdded() -- メンバーがGoogleグループに登録済みか確認する
	
	if (the clipboard) is equal to "added" then -- AppleScript Tool 4
		say "このメンバーは登録済みです。次のメンバーに進みます" -- 登録済みの場合
	else -- 登録済みでない場合
		my pushAddMember() -- "メンバーを追加" の画面を表示させる
		my copyMailAddress() -- エクセルのメールアドレスをコピーする
		my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
		my markRegistered() -- 登録済みを示すために added と追記する
		say "グーグルグループにメンバーを登録しました。次のメンバーに進みます"
	end if
	
	my gotoNextMember() -- 次のメンバーの行に移る
	my copyCell() -- エクセルのメールアドレスをコピーする
	
end repeat

say "メンバー登録が完了しました"


on copyCell() -- エクセルのメールアドレスをコピーする
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code {55, 8} -- command + C、メールアドレスをコピー
		delay 1
	end tell
	
end copyCell


on checkAdded() -- メンバーがGoogleグループに登録済みか確認する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 124 -- right、カーソル移動
		delay 1
		key code {55, 8} -- command + C、登録済みステータスをコピー
		delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
	end tell
	
end checkAdded


on pushAddMember() -- "メンバーを追加" の画面を表示させる
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- Web ページで "メンバーを追加" ボタンを検索する
		set the clipboard to "メンバーを追加" -- AppleScript Tool 3
		delay 1
		key code {55, 3} -- command + F
		delay 1
		key code {55, 9} -- command + V、clipboard の値がペーストされる
		delay 1
		key code 36 -- return
		delay 1
		key code 53 -- escape
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end pushAddMember


on copyMailAddress() -- エクセルのメールアドレスをコピーする
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		set the clipboard to "" -- クリップボードの値をクリアする
		key code 123 -- left、カーソル移動
		delay 1
		key code {55, 8} -- command + C、メールアドレスをコピー
		delay 1
	end tell
	
end copyMailAddress


on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
	
	tell application "Google Chrome" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		-- メンバーを追加する
		key code {55, 9} -- command + V、メールアドレスをペースト
		delay 1
		repeat 8 times
			key code 48 -- tab
		end repeat
		delay 1
		key code 49 -- space、"メンバーを追加" ボタンを押す
		delay 1
	end tell
	
end addMember


on markRegistered() -- 登録済みを示すために added と追記する
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code 124 -- right、カーソル移動
		delay 1
		keystroke "added" -- Googleグループ登録済みとして added と入力
		delay 1
	end tell
	
end markRegistered


on gotoNextMember() -- 次のメンバーの行に移る
	
	tell application "Microsoft Excel" to activate -- AppleScript Tool 1
	delay 1
	
	tell application "System Events" -- AppleScript Tool 2
		key code 125 -- down
		key code 123 -- left
		delay 1
	end tell
	
end gotoNextMember
```
</div></details>

**稼働確認**

- **say によって、AppleScript が今何の処理をしているのかが、よく分かるようになりました。**
- say は変数も扱えますので、大量の件数を処理する場合「xx件中、xx件の登録が完了しました」のように喋らせることもできます。

#AppleScript 七つ道具

- AppleScript 七つ道具 として、以下をご紹介しました。
      - **tell**
      - **key code**
      - **clipboard**
      - **if**
      - **on - end**
      - **repeat**
      - **say**
- これらを活用すれば、**Mac 上のほとんどすべてのアプリを自在にコントロール**できるようになります。

#以上で説明は終わりです。

- お疲れさまでした。最後まで記事を読んでいただきありがとうございます！
- 記事を読まれた方が、手作業でやっていた大量の反復作業を、AppleScript を利用することによって、**より速く・正確に・快適に**実施していただけるようになれば幸いです！