Macを使っていてイライラするのが、ウインドウのサイズ調整。

特にExcelなどのWindowsと共通のアプリではファイルを開くとウインドウが小さく開くことがあります。

ウインドウズだと、全画面表示のままファイルを開いたり閉じたりできるのであまり気にしないですむのですが、Macでは書類ごとにウインドウのサイズを覚えるという思想のため、異なる環境で書類を開くとウインドウサイズの調整が必要になり、少し面倒です。

もちろん、ウインドウのサイズを覚えてくれることでメリットもあるのですが……このあたりがMacの操作性を好きになるか嫌いになるか影響する部分かもしれませんね。

最近のOS Xならばフルスクリーンにするという手もありますが、それはそれで不便な場合もあり、スッキリしません。iMacの27インチとかだとフルスクリーンでは大げさすぎる……


こんな問題を簡単に解決する唯一の方法は「自動化」 そう、Macには伝家の宝刀「AppleScript」があります!!


AppleScriptを使ってみよう!
まずは、環境を整備しましょう。アプリケーション/ユーティリティ にある「スクリプトエディタ」を起動してください。(Lanchpad では「その他」の中にあります)
scripteditoricon

スクリプトエディタ > 環境設定… を開き「メニューバーにスクリプトメニューを表示」をONにします。これでメニューバー右上に「スクリプトメニュー」というのが登録されます。この記事ではここにスクリプトを登録して呼び出すことで、ウインドウサイズの変更を実現します!
scriptprefs

では、さっそく好きなサイズのウインドウに一発変更するためのスクリプトを作成します。処理の流れは以下のような感じ
  1. 一番手前のアプリを見つける
  2. 一番手前のウインドウを見つける
  3. そのウインドウサイズを変更する

できあがりは以下のようになります。
windowsizeset_kansei

さっそくこのAppleScriptを解説してみましょう。まずは変更したいサイズを一番最初に定義しておきます。こうしておくと後で変更したいときに便利です。
set bestSize to {700, 900}
「一番手前のアプリを見つける」を作る
ここから「一番手前のアプリを見つける」を作っていきます。アプリの状態や存在を確認するには「System Events」というアプリに命令を送ります。AppleScriptでは命令を送るとき「tell 〜」という書式になります。そして呼び出しの終わりに「end tell」と書きます。この間に処理させたい内容を記入します。
tell application "System Events"
 -- ここに処理を入力する
end tell
※ AppleScript では 先頭に -- を入力するとコメント行になり、処理されません。

ではさっそく System Events に対して、一番手前のアプリを見つけるように命令しましょう。一番手前は「frontmost」という変数がtrueになっているアプリですので、すべての実行中のアプリ「every process」のうち「frontmost」が「true」を見つけるには以下のように書きます。
tell application "System Events"
	every process whose frontmost is true
end tell
※ whose がポイントですね!

ちょっとこの状態で実行してみましょう。ウインドウ上にある「実行」ボタンをクリックします。
execresult01
※結果が出ていない場合は、左下の(i)ボタンをクリックしてください。

実行結果には「{application process "Script Editor" of application "System Events"}」と出ています。いま最前面にいるのが自分自身つまり「スクリプトエディタ」ですから、その英語名で取得できたようです。でも前後の{}に注意してください。
{application process "Script Editor" of application "System Events"}
これは、この結果がリスト形式の変数であるという意味になります。つまりリストという箱に入っている状態。このままでは処理を続けられないので、中から取り出します。取り出したやつを「topProcess」という変数に入れましょう。以下のようにします。
tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
end tell
※ item ? of ってやるとリストの ? 番目の項目を取り出すという意味になります

もう一度、実行してみましょう。前後の{}がとれました!
execresult02

…… これで「一番手前のアプリを見つける」は達成しました

「一番手前のウインドウを見つける」を作る
次に、「一番手前のウインドウ」を見つけましょう。
一番手前のウインドウというのは、一番手前のアプリが持っているものですから、一番手前のアプリに対して命令を送るようにします。以下のような感じ。
tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
	tell topProcess
		-- ここに処理を追加します
	end tell
end tell
※ topProcess には tell だけが付いています

一番手前のウインドウを取得してみましょう。単に「window 1」としても取得できます。それを変数「topDocWindow」に格納します。
tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
	tell topProcess
		set topDocWindow  to window 1
	end tell
end tell

これで実行結果を見てみましょう。多くの場合は期待通りのウインドウが取得できますが…
…フォントダイアログが開いていると、そのフォントダイアログが取得されてしまいます。ほとんどの場合、サイズを変更したくなるのはこのダイアログではありません。
execresult03
では、どうするのか?以下のように考えます。
→ アプリが持つすべてのウインドウの中から、特定の種類のものだけを抜き出し、その1番目を取る

具体的には以下のようなコードを書きます。先ほど紹介したアプリの見つけ方に似ていますね!
tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
	tell topProcess
		set topDocWindow to item 1 of (every window whose subrole is "AXStandardWindow")
	end tell
end tell
※「every window」ですべてのウインドウを意味し、「subrole」がウインドウの種類の変数です。AXStandardWindow という種類で絞り込めば、フォントダイアログは除外されます。
その中の一番最初のアイテムが一番手前のウインドウとなるのです。実行して確認してみましょう!
(エラーが表示される場合は、システム環境設定 - セキュリティとプライバシー で「アクセシビリティ」に登録されている「スクリプトエディタ」をONにしてください)

これで「一番手前のウインドウ」は取得できました。

「そのウインドウサイズを変更する」を作る
あとは、一番手前のウインドウサイズを変更してやるだけです。
最初に定義した bestSize を topDocWindow の size 属性に適用してやるには「set size of topDocWindow to bestSize」とします。これで完成です!!
set bestSize to {700, 900}

tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
	tell topProcess
		set topDocWindow to item 1 of (every window whose subrole is "AXStandardWindow")
		set size of topDocWindow to bestSize
	end tell
end tell

このスクリプトを実行してみましょう。編集中のスクリプトエディタのウインドウが変化しましたね!
これを、この記事で最初に有効化した「スクリプトメニュー」に「ウインドウサイズを変更」というファイル名で登録します。
スクリプトメニューに登録するには、以下の場所にこのスクリプトを名前をつけて保存するだけです。
「 'ホーム'/ライブラリ/Scripts」
※'ホーム'とは、ログイン名が kanji ならば、/Users/kanji です
ライブラリフォルダにアクセスするには、ファイルを保存するダイアログを表示し、ファイル名が選択されている状態で「/」を入力すると以下のダイアログが表示されるので、~/Library/Scripts と入力して「移動」をクリックします。移動できたらファイルを保存してください。
inputpath

あとはウインドウを変更したい時にスクリプトメニューから選んで実行すれば、ExcelだろうがSafariだろうが、指定したサイズに変更できるようになります。
いろんなサイズを使い分けたければ「set bestSize to {700,900}」の数値部分を変更したものを別名で複数保存して使い分ければよいでしょう。
scriptmenu

注意)以下のエラーが出るときは、システム環境設定 - セキュリティとプライバシー で「アクセシビリティ」に登録されている「SystemUIServer」をONにしてください
systemuierror


補足:現在のウインドウからウインドウサイズを取得するスクリプト
この記事では{700,900}の部分を書き換えて、好きなサイズにウインドウを変更するというのを案内していますが、この数値を期待通りに設定するのは初心者には難しいでしょう。そこで、目の前のウインドウがどのくらいのサイズかを調べるスクリプトも作っておくと便利です。以下のようになります。
tell application "System Events"
	set topProcess to item 1 of (every process whose frontmost is true)
	tell topProcess
		set topDocWindow to item 1 of (every window whose subrole is "AXStandardWindow")
		set bestSize to size of topDocWindow
	end tell
end tell
display dialog ((item 1 of bestSize) as text) & " x " & (item 2 of bestSize) as text
これらの操作に慣れてきたら、ちょっと応用して、ウインドウの位置(position)も同じ要領で変更してみましょう。set position of topDocWindow to {10,40} のようにするとウインドウの位置を変更できます。 あと、このスクリプトをキーボードショートカットですばやく実行する方法も後日紹介予定です。簡単に説明すると、Automatorでサービスを作り、その中でこの記事で紹介したAppleScriptを登録。そしてそのサービスにキーボードショートカットを割り当てます。