AppleScriptのエラーコード、特に -2707 について.

かなり巨大なサイズ(約1.8MB, 現在5000行程度.更に増える予定あり)の外部ライブラリ(*.scptd)やASOCなどを利用しているのが原因なのか、最近、タイトルにあるようなエラーコードがよく表示されます.

通常、文法に問題がある場合はコンパイルに失敗するだけで済むはずですが、コンパイル自体は通ります.ただしその直後に保存または実行しようとするとタイトルにあるようなエラーコードが提示され、保存できません.しばらくするとポップアップ?で「書類が自動保存できませんでした.エラー2,707)」と表示されます.

コードのとある部分を削除すると保存・実行できたりしますが(もちろんコンパイルも通ります)、コピー&ペーストでなく「手打ち」で同じコードを入力しても同じくエラーが発生したりして、なかなか回避策がみつかりません.どこかに問題があるのは間違いないのでしょうが、その特定ができないのです.

そもそも、エラーコード -2707がどういったことが原因で発生するものなのかすらわからないので、まずはそれを知りたいと思っています.少し調べるとどうやら「スタックオーバーフロー」が原因だとわかるのですが、それに対処する方法がわかりません.Macに搭載されているメモリの不足が原因なのか、はたまたたくさんのアプリケーションを立ち上げているので運用時のメモリ不足なのか、とにかくざっくりと「スタックオーバーフローです」と言われて困っている次第です.

どうか、お知恵をお貸しください.

Mac mini, macOS 10.14

投稿日 2021/04/18 08:58

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2021/04/19 00:29

保存は".scpt"で保存しているのですか?ASOCということはXcodeですか?



「基本的には、スクリプトが複雑すぎることを意味します。プロパティが多すぎたり、ネストされたifが多すぎたりする可能性があります。おそらくいくつかを他のクラスやライブラリに移動することによって、それを単純化する必要があると思います。」

https://lists.apple.com/archives/applescriptobjc-dev/2014/Dec/msg00001.html

返信: 9
スレッドに付いたマーク ランキングトップの返信

2021/04/19 00:29 light289 への返信

保存は".scpt"で保存しているのですか?ASOCということはXcodeですか?



「基本的には、スクリプトが複雑すぎることを意味します。プロパティが多すぎたり、ネストされたifが多すぎたりする可能性があります。おそらくいくつかを他のクラスやライブラリに移動することによって、それを単純化する必要があると思います。」

https://lists.apple.com/archives/applescriptobjc-dev/2014/Dec/msg00001.html

2021/04/19 08:45 hohokihai への返信

>保存は".scpt"で保存しているのですか?ASOCということはXcodeですか?

このあたりの環境は初めに書いておくべきでしたね、すいません.

今回のエラーの件で悩まされているのは、Xcode上でなくスクリプトエディタ上でのことです.保存形式は".scptd"、基本的には ".app"です.


>「基本的には、スクリプトが複雑すぎることを意味します。プロパティが多すぎたり、ネストされたifが多すぎたりする可能性があります。おそらくいくつかを他のクラスやライブラリに移動することによって、それを単純化する必要があると思います。」

スクリプトが複雑すぎるという意味で心当たりがありすぎるので、そうするとそこが原因の多くを占めていると思います.ただ、ネストは見通しの問題もありほとんどしませんが、試作の部品をコメントアウトして残しておくことが多いので行数は基本、多めです.今回のエラーの件でも、当のエラーが発生する度に空行やコメントアウトしている明らかに不要な部分を削除して行数を減らすと、おおむねその分だけ命令の行を追加できる(エラーが発生しない)ような感じです.

ただやはり解せないのは、実行時やコンパイル時でなく保存しようとする時にのみ今回のこのエラーが発生することです.特に「スクリプトが複雑すぎる」かどうかの判断はコンパイラがするものだと思っていたので、なぜに保存時にするのか? という疑念も残ります.とはいえ、原因と解決方法の一端が今回のご指摘で見えてきたことも確かなので、参考になりました.ありがとうございます。

2021/04/19 22:37 light289 への返信

> 保存しようとする時にのみ今回のこのエラーが発生することです.


確かに不可解な気はしますが、(".scptd"にも含まれる)".scpt"はバイナリ形式なので、保存の際に構文チェックされコンパイルされるのでしょう。


> おおむねその分だけ命令の行を追加できる(エラーが発生しない)ような感じです.


単に行が長すぎるというだけなら、"load script"などが使えそうですがどうでしょうか。


https://stackoverflow.com/questions/2606136/import-applescript-methods-in-another-applescript

2021/04/20 00:12 light289 への返信

「-2707」の問題は再現できなかったので、ファイル保存時の問題と回避策ということでコメントします。外してたらごめんなさいということで...。


例えば下のコードの場合、スクリプトを実行後にファイルを保存しようとするとエラーとなります。

use AppleScript version "2.7"
use scripting additions
use framework "Cocoa"

property OSX : current application
property nil : missing value

on run
    set str to "hello"
    set nsstr to OSX's NSString's stringWithString:str
    return nsstr as text
end run



シートダイアログのメッセージに従いコンパイル後に保存すると大丈夫ですが、Objective-C なコードを Script Object 内に書くことで保存時の問題が回避できます。


on run
    my func("hello")
end run

on func(str)
    script obj
        use AppleScript version "2.7"
        use scripting additions
        use framework "Cocoa"

        property OSX : current application
        property nil : missing value

        on run
            set nsstr to OSX's NSString's stringWithString:str
            return nsstr as text
        end run
    end script
    tell obj to run
end func


ということで、-2707 の問題が解決できるかは不明ですが...、コーディングスタイルを変更してみてはどうでしょうか?


2021/05/09 02:02 hohokihai への返信

>単に行が長すぎるというだけなら、"load script"などが使えそうですがどうでしょうか。

(従来) property NR : script "myLib.scptd"

(変更後) property NR : load script "~/自作ライブラリのあるフォルダ/myLib.scptd"

(呼び出し時) NR's xxx()

とすることで既存の(自作した)ライブラリに手を加えることなく、多少の改善ができたみたいです.ただし、エラー「-2707 errOSAInternalTableOverflow」がまったく発生しなくなったわけでないので、改善と呼ぶには少し遠い気もしますが.

ちなみに自作したライブラリ(runハンドラを含まない)でなく、それを呼び出すスクリプト(runハンドラを含む)の行数を減らす目的で load script 命令を使用するのは、いろいろと思うところがありやめました.いくつかのスクリプトファイルを管理する手間が増えると「手軽に開発できなくなる」からです.手軽さを求めてAppleScriptを使用しているところが大きいので……

2021/04/24 20:56 hohokihai への返信

> おおむねその分だけ命令の行を追加できる(エラーが発生しない)ような感じです.

>> 単に行が長すぎるというだけなら、"load script"などが使えそうですがどうでしょうか。

load script 命令は少し検討してみたいと思います.使い慣れない命令なので、その結果の書き込みは少し先になってしまうかもしれませんが.

2021/04/18 22:30 gaitiro への返信

>古いエラーコードによると-2707はerrOSAInternalTableOverflowみたいです。

直訳すると「内部テーブルのオーバーフロー」とのことですが、何のテーブルなのか、そこがわからないと解決のしようもなくて.


>フォルダー内のファイルを順序処理するようなスクリプトならば項目数が多すぎるのでは?

今そのエラーが出ているスクリプトはHTML書類を処理するものなのですが、項目数が多すぎるという意味でいうと、たしかに多いかもしれません.配列の項目が2000とかそういうレベルになりますし.ただ、エラーが出るのは「スクリプトの実行中」でなく、コンパイル後に手動または自動で保存をしようとする時です.コンパイルは問題なく完了します.「項目数が多い=メモリをより必要とする」と考えてメモリ不足が原因だと践んでいますが、明確な理由はわかりません.せめて実行中に起こるエラーであれば対処できるのですが…….

2021/04/24 21:12 Hiro__S への返信

>「-2707」の問題は再現できなかったので、ファイル保存時の問題と回避策ということでコメントします。外してたらごめんなさいということで...。

ハンドラの中にスクリプトオブジェクトを定義して、それを tell 文から実行するというのは初見でした.勉強になります.

この手法を試しましたが、部分的に適用させたからなのか、例のダイアログはやはり出てしまいます(Objective-C ポインタ云々).ただ、こうすることで回避できた問題もありまして、運用方法によっては有用なのかな、という印象は持ちました.そもそも使い慣れない命令なので(初見でしたし)、単に正しい運用方法を知らないだけ、なのでしょう.いろいろ実験してみようと思います.

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

AppleScriptのエラーコード、特に -2707 について.

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。