1

特定の基準に基づいて Daylite タスクにいくつかの電子メールを自動的に追加する必要があるため、Mail.app ルールと AppleScript を設定してこれを実現します。1 つだけ問題があります。AppleScript がメッセージの内容を取得すると、最後に 'a' が追加されます (ビープ音も鳴り、明らかに許可されていないキーストロークを試みたことを知らせます)。

AppleScript は次のようになります。

using terms from application "Mail"
    on perform mail action with messages theMessages for rule theRule
        tell application "Mail"
            repeat with eachMessage in theMessages
                try
                    set this_subject to subject of eachMessage
                    set this_body to content of eachMessage
                    if this_subject is "" then error
                on error
                    set this_subject to "No subject."
                end try
                activate application "Daylite"
                tell application "System Events"
                    keystroke "t" using {command down, shift down}
                    keystroke this_subject
                    keystroke tab
                    keystroke this_body
                    keystroke "s" using command down
                end tell
            end repeat
        end tell
    end perform mail action with messages
end using terms from

これにより、Daylite で新しいタスクが取得されます。タスクのタイトルは電子メールの件名であり、正しく表示されますが、電子メールの本文である添付メモは正しく表示されません。

したがって、ルールに一致する電子メールを受信した場合、その電子メールは次のとおりです。

From: 架空の妻

件名:ゴミ出しを忘れずに!

本文:もう一度忘れたら離婚します。

最終的には、次のようなタスクになります。

☐ ゴミ出しを忘れずに!

もう一度忘れたら、離婚を申請します。

… このシナリオでの架空の妻を、読み書きがほとんどできないカナダ人のように聞こえるようにします。(さらに、許可されていない何かを入力しようとしたことを知らせるシステム警告音が鳴ります。)

本文に複数行のテキストがある場合、改行も削除されます。

私はそれを次のように設定できることを知っています:

set the clipboard to this_body

そして交換

keystroke this_body

keystroke "v" using command down

…しかし、それは本当に洗練されていない解決策であり、ルールが実行されるたびにクリップボードにあるものを置き換えたくありません。

ここで何が間違っていますか?TextEdit でもこれをテストしましたが、そこでも同じ問題が発生するため、Daylite の問題ではありません。また、「set this_body…」行の末尾に「as Unicode text」または「as string」または「as «class UTF8»」を追加しようとしましたが、どれも問題を解決しませんでした。

完全な馬鹿として、それが私があなたを理解する唯一の方法だからです。ありがとう。

4

1 に答える 1

2

多くの人が犯す基本的な間違いの 1 つは、アプリケーションが実行方法を知らないことをアプリケーションに指示することです。AppleScript ディクショナリで見つけることができることだけを実行するようにアプリケーションに指示する必要があります。これは、アプリケーションが実行する方法を実際にすべて知っているためです...繰り返しループの実行などのいくつかの基本的な汎用 AppleScript のものに加えて。

あなたはこの罠に陥っています。そのコードはすべてコードの「tell application Mail」ブロック内にあるため、Daylight と System Events に何かを行うように Mail に指示しています。このタイプのエラーは、追跡が非常に困難な問題を引き起こすことがよくあります。

そのため、私の最初の提案は、Mail に不必要なことをするように指示するのをやめることです。さまざまなアプリケーション コマンドを互いに分離するコードを作成する方法を次に示します。

using terms from application "Mail"
    on perform mail action with messages theMessages for rule theRule
        repeat with eachMessage in theMessages
            tell application "Mail"
                set this_subject to subject of eachMessage
                set this_body to content of eachMessage
            end tell
            if this_subject is "" then set this_subject to "No subject."

            activate application "Daylite"
            delay 0.2
            tell application "System Events"
                tell process "Daylite"
                    keystroke "t" using {command down, shift down}
                    delay 0.2
                    keystroke this_subject
                    delay 0.2
                    keystroke tab
                    delay 0.2
                    keystroke this_body
                    delay 0.2
                    keystroke "s" using command down
                end tell
            end tell
        end repeat
    end perform mail action with messages
end using terms from

また、コードの一部の間に小さな遅延を追加したことにも気付くでしょう。コンピューター インターフェイスが処理できる速度を超えてコードが実行される場合があるため、それもエラーの原因となる可能性があります。必要に応じて、遅延の長さを増やしてみることもできます (1 秒を超える遅延は過剰であり、必要ではありません)。

これらの変更とより長い遅延が機能しない場合、簡単な解決策は、テキストが「a」で終わっているかどうかを確認し、それを削除することです。キーストロークタブとキーストロークthis_body行の間のこのようなもの...

if this_body ends with "a" then set this_body to text 1 thru -2 of this_body

幸運を!

編集:「キーストローク」プロセスは、電子メールからの戻り文字が気に入らないようです。それがノイズの原因だと思います...リターン文字に当たるとビープ音が鳴ります。とにかく、このようなものを試すことができます。空白の TextEdit ドキュメントを開き、Mail で電子メールを選択して、AppleScript Editor でコードを実行するだけです。このアイデアをデイライト スクリプトに組み込むことができます。

tell application "Mail"
    set eachMessage to item 1 of (get selection)
    set this_subject to subject of eachMessage
    set this_body to content of eachMessage
end tell

set bodyList to paragraphs of this_body

activate application "TextEdit"
tell application "System Events"
    tell process "TextEdit"
        repeat with i from 1 to count of bodyList
            keystroke (item i of bodyList)
            keystroke return
        end repeat
    end tell
end tell
于 2013-06-19T14:13:37.910 に答える