「Ask the Script Doctor」は、AppleScriptとAutomatorを使ってMacで実際に起こる問題を解決する定期コラムです。解決してほしい問題がありましたら、Script Doctorまでメールでお問い合わせください。
小説を書いたりメールを書いたりする時など、私たちは常にテキストを使っています。AppleScriptは、テキスト中心の作業をより簡単かつ効率的に行うための優れたツールです。そのため、よくあるテキスト作業を簡素化する方法について多くの質問を受けます。ここでは、そうした質問のいくつかと、それに対する私の回答をご紹介します。
Q: テキストをたくさん書くのですが、例えば選択したテキストを引用符で囲むなど、何度も繰り返す作業を簡素化したいと思っています。何か提案はありますか?
これ(および同様のタスク)を実行するには、サービスを作成します。次に、折り返したいテキストを選択し、サービスを実行して変更を適用します。残念ながら、OS XではAppleScriptをサービスとして保存できません。しかし、この作業を実行できるツールを他に2つお勧めします。
Automator: Automatorを開き、作成したい書類の種類として「サービス」を選択し、 「選択」をクリックします。編集ウィンドウで、「サービスが選択したものを受け取る」ドロップダウンからテキストを選択し、「出力は選択したテキストを置き換えます」ボックスにチェックを入れます。次に、左側のリストから「AppleScriptを実行」アクションを編集パネルにドラッグします(AppleScript検索ウィンドウに「Enter」と入力すると操作が簡単になります)。デフォルトのスクリプトテキストを以下のテキストに置き換えます。
実行時に{入力、パラメータ}は文字列として""" & input & """を返します。
ワークフローを保存すると、テキストを選択したときに「アプリケーション > サービス」メニュー(およびコンテキストサービスをサポートするアプリの場合はコンテキストメニュー)に表示されます。そのサービスを選択すると、選択したテキストが引用符で囲まれます。同じスクリプトを使用してテキストを別の文字列で囲むには、"""独自のラッパーに置き換えてください。(置換文字列の構造は、引用符、ラッパー、引用符です。上記の例では、2番目の引用符の前にスラッシュを付けて、リテラル文字として使用することを示す必要があります。)
ThisService: Automatorで作成されたサービスは動作が遅くなる傾向があります。より高速なものをお探しの場合は、ThisService(無料)というユーティリティをお勧めします。使用するには、AppleScriptエディタを開き、以下のスクリプトを入力して、コンパイル済みスクリプトとして保存してください。
プロセス(入力)で、文字列として """ & input & """ を返し、プロセスを終了します。
次に、ThisServiceを起動し、スクリプトファイルを指定して、「入力を受け取る」と「出力を生成する」のチェックボックスをオンにし、名前を付けてパッケージ化します。ユーティリティがスクリプトをサービスに変換し、自動的にインストールします。これでサービスは「サービス」メニューに表示されるようになり、いつでも起動して選択したテキストを引用符で囲むことができます。
Q: 会計処理をしていると、テキストファイルに数字のリストが出てくることがよくあります。これらの数字を合計して合計を出さなければなりません。数字のリスト全体をクリップボードにコピーし、スクリプトを実行して合計を計算できれば良いのですが、実現可能でしょうか?
Standard Additions スクリプティング機能追加(OS X に付属する AppleScript の拡張機能)には、クリップボードの内容を取得および設定するためのコマンドが含まれています。つまり、このタスクを実行するには、クリップボード上の段落を取得し、それらをループ処理して合計するだけです。以下の例では、この処理を実行し、完了時にアラートを表示します。tryスクリプト内のステートメントに注目してください。コピーされたテキスト内に数字以外の段落がある場合、このステートメントによって、それらの段落がエラーの原因になったり、合計に加算されたりすることがなくなります。
-- クリップボード上のテキストの段落を取得します。theParagraphs を (クリップボードの) 段落に設定します。-- 合計の変数を初期化します。theTotal を 0 に設定します。-- テキストの段落をループします。theParagraphs 内の aParagraph を使用して繰り返します。-- 現在の段落を合計に追加してみます。theTotal を theTotal + aParagraph に設定します。繰り返します。-- 合計をクリップボードに戻します。クリップボードに theTotal を文字列として設定します。-- 段落が追加されたことをユーザーに警告します。「クリップボードの段落が追加されました。」という警告メッセージを表示します。「合計 " & theTotal & " がクリップボードにコピーされました。」
Q: フォルダー内の一連の Microsoft Word 文書をプレーンテキスト形式に変換できるスクリプトはありますか?
幸運なことに、Microsoft Word には、文書のオープン、操作、保存のための充実したスクリプトサポートが備わっています。以下のスクリプトは、Word 文書のフォルダと出力フォルダを指定します。指定されたフォルダ内のファイルをループ処理し、Word で開き、出力フォルダにテキストファイルとして保存します。
--Word 文書のフォルダを要求し、プロンプト「Word 文書のフォルダを選択してください:」でフォルダを選択するように theFolder を設定します。--出力フォルダを要求し、プロンプト「出力フォルダを選択してください:」でフォルダを選択するように theOutputFolder を設定します。--選択したフォルダ内の文書のリストを取得し、アプリケーション「Finder」に theDocuments をフォルダ内のすべてのファイルに設定するように指示します。--検出された文書をループします。theDocuments 内の aDocument を使用して繰り返します。--現在の文書を Finder 参照ではなく、AppleScript エイリアスに変換します。aDocument を aDocument のエイリアスとして設定します。--文書の名前と拡張子を取得します。theName を aDocument の表示名に設定します (aDocument の情報)。theExtension を aDocument の名前拡張子に設定します (aDocument の情報)。--theName が "." で終わる場合は、拡張子なしで名前を取得します。 & theExtension then set theName to text 1 thru -(length of theExtension) of theName --保存パスを準備します set theOutputFile to ((theOutputFolder as string) & theName & ".txt") --既存のファイルが上書きされないようにします tell application "Finder" if file theOutputFile exists then error "Existing file found." end tell --文書を開きます tell application "Microsoft Word" open aDocument --文書を選択した出力フォルダにテキストとして保存します tell active document save as file format format text file name theOutputFile --元の文書を保存せずに閉じます closesaving no end tell end tellend repeat
Script Doctor に問題がある場合は、[email protected]までお送りください。