• ベストアンサー

AppleScript、変数名の中に変数

AppleScriptを少しかじっただけで他の言語にうとい素人です。 repeat with i from 1 to 2 set aData(i) to... end repeat これでaData1とaData2という変数が作れたり呼び出せたりしたら便利だと思うのですが、 試してみたところできませんでした。 AppleScriptでも、特別な宣言などをすれば可能なのでしょうか? また、できたらで結構ですが、他の言語ならできる、という情報もあれば教えて下さい。 手抜きせず、リストに格納してやるのが王道ってことでしょうか? ^-^;

noname#250373
noname#250373

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

AppleScriptのリストが配列と同じと考えられます。 set item 1 of aData to .... で使えます。 AppleScriptは結構癖があるので、Rubyなどのスクリプト言語を基本に使い、アプリケーションなどを操作するときにはスクリプト言語からShellを呼び出し、osascript などのコマンドでAppleScriptを使うのが楽なように思います。

noname#250373
質問者

お礼

ありがとうございました。

noname#250373
質問者

補足

回答ありがとうございます。 すみません。質問に書いているとおり、リストでできることは理解しています。 Rubyでは「変数名に変数を織り交ぜることが可能」ということでしょうか?

その他の回答 (3)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

No.1,2です >どちらもベストアンサーにしたいんですが… 回答者にとってはベストアンサーよりも、お礼欄や補足欄で反応していただけいるのが 一番うれしいわけで、 No3でevalについては的確な回答をされていますので、付け加えることもないのですが、evalを使うとプログラムの見通しが悪くなりますので、他の方法がないか考えてみる必要があると思います。 ちょっと別の視点から AppleScriptの質問で、他の言語を勧めるのも気がひけますが、プログラム言語一般に言えることですが、ある程度完成されてきますと、互換性を重視することから、大きな変更ができないようになってしまいます。 AppleScriptは登場した当初は先進的で、アプリケーションを外部からコントロールする方法として定着してきましたが、いろいろな問題を抱えたまま現在に至っているように感じます。(特に文字列の処理と外部ルーチンの追加についての使いづらさが目立ちます) これからOSXで使うことを前提としてスクリプト言語を選ぶとなると、Rubyが有力な候補に挙がるのではないかと思います。私自身Rubyを中心に使っていますのでひいき目に見てしまいますが、後はPython, Perlあたりでしょうか。いずれも簡単にshellに命令を渡せますので、osascript命令で多少の使いずらさはありますが、AppleScriptを使うことは可能です。

noname#250373
質問者

お礼

私もお礼がもらえるのが一番嬉しいですが、ベストアンサーも大好きです(笑 手間をかけて、その上見通しが悪くなるようなら辞めた方が良いですね^-^; 素直にリスト使います。 汎用性のある言語を習得すべきことは頭では分かっているのですが…なかなかその一歩が踏み出せずにいます(汗 少しでも話についていけるようになりたいです。 今後ともよろしくお願いします!

noname#250373
質問者

補足

kmeeさん、すみません。 次回同じ状況になったらkmeeさんに一票入れます! 今後ともよろしくお願いします!

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

いくつかの言語では「eval」という命令や関数が用意されていて、 eval(文字列) という感じで使用すると、文字列を命令と解釈して、現在の環境で実行します。 Perlの例: $t=1; print $t,"\n" ; # 1と出力 eval('$t=2') ; # ここに $t=2; と書いたのと同等 print $t,"\n" ; # 2と出力 また、変数等を使って、変数名を指定できる仕組みが用意されている言語もあります。 http://php.net/manual/ja/language.variables.variable.php http://perldoc.jp/docs/perl/5.16.1/perlref.pod#Symbolic32references いずれの方法も、大変危険な方法であって、これでしかできない、というときの最終手段です。 # 例えば、「ファイルを消去する命令」をevalに渡すと、ファイルが消去されます。 これらを使わなければならないようなプログラムなら、設計から考えなおした方がよいです。 リストや配列、ハッシュテーブル等の機能があるのなら、そちらを使うのが普通でしょう。 AppleScriptにはあまり詳しくないのですが、ざっと眺める限りでは、eval相当のものは無いようです。 参照とかプロパティとかをうまく使えば、sData1でもsData(1)でも同じものをアクセスするように作れそうな気はします。

noname#250373
質問者

お礼

ありがとうございました! リンク1つ目がまさに私がやりたかったことです。 evalについてもようやく理解しました。 別途、命令文の体をなす「文字列を生成」させておいて、 それをevalで「命令として実行」ということですね。 素人なので前者を察するのに苦労しました^-^; その方法ならosascriptでも同じようにできますね。 もっと簡単に出来る方法もありそうです。 勉強になりました!

noname#250373
質問者

補足

お礼の訂正:リンク2つ目がまさしくそれですね(汗 それと、ki073さんだと思ってコメントしてました。すみません。 evalとosascriptの例示、ありがとうございました! どちらもベストアンサーにしたいんですが… ランダムに決めるか、敢えて引き分けとして締め切りにするか… 結果は恨みっこなしでお願いしますm(_ _)m

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

aData1とaData(1)は違った変数ですので、同じに扱える方がおかしいのですが、どういうことをされたいのでしょうか? 変数をスクリプトの中で作るには、Rubyの場合はevalを使えば可能です。 いつでもaData1と配列要素のaData[1]が同じ値を取るようにすることも工夫すれば出来そうな気がしますが、確認していません。 AppleScriptの場合の記事がありますが、内容を理解できていません。 http://blog.dtpwiki.jp/dtp/2009/05/applescript-d40.html

noname#250373
質問者

お礼

度々ありがとうございます。 私のしたいこととRubyのevalの用途とは違うようですし、参考の記事はレコードからの参照の話ですので、質問とは関係無いようです。

noname#250373
質問者

補足

恐らく私の質問が悪いせいで伝わっていないようです。 aData1, aData2という変数を手入力で設定せず、 AppleScript自身で、実行時にaData1,aData2という「変数名」を設定させる方法があるか、という質問です。 これでも伝わらなかったらスルーして下さいm(_ _)m

関連するQ&A

  • AppleScriptでiCalを動かしてみたが

    以前に下記のようなAppleScriptがネット上に有りましたが(1999年12月28日) ----------------------------------------------実行 set dSta to my date "2013年6月4日火曜日 0:00:00" set dEnd to my date "2013年6月4日火曜日 16:00:00" -- 検索するカレンダー名 set calName to "仕事" -- 結果を格納する変数 set copyText to "" tell application "Calendar" set theList to every event of calendar calName whose (start date ≥ dSta) and (end date ≤ dEnd) repeat with x in theList set aDate to (start date of x) set copyText to copyText & (aDate as text) & tab & summary of x & (ASCII character 10) end repeat end tell -- 結果をクリップボードにコピー set copyText2 to my Sortsc(copyText) set the clipboard to copyText2 on Sortsc(aData) do shell script "echo " & quoted form of aData & " | sort -d" end Sortsc ------------------------------------------------------------- 今回これを利用したい思い osx10.8 applescript エディタ2.5.1にて起動してみようとしましたが下記のような不思議な現象がでました。 set dSta to my date "2013年6月4日火曜日 0:00:00" set dEnd to my date "2013年6月4日火曜日 16:00:00" としていますが date "1999年12月28日火曜日 0:00:00" and end date ≤ date "1999年12月28日火曜日 16:00:00" となってしまった。 なぜそうなったのかが分かりません。 どなたかご存知のお方がおられましたらご教授いただきたいのですが。 -----------------------------------返された値 tell application "Calendar" get every event of calendar "仕事" whose start date ≥ date "1999年12月28日火曜日 0:00:00" and end date ≤ date "1999年12月28日火曜日 16:00:00" --> {} end tell tell current application do shell script "echo '' | sort -d" --> "" end tell tell application "AppleScript Editor" set the clipboard to "" end tell ------------------------------------------------------------- 因にosx10.6 AppleScript2.3にはきちんと返された値は内容が取得されています。

    • ベストアンサー
    • Mac
  • AppleScriptでpathを取得

    クリックしたファイルの絶対パスをクリップボードに保存する AppleScript(以下に記載)があるのですが、これでは クリップボードの中身が '/Users/ABC/Desktop/tmp1.jpg' '/Users/ABC/Desktop/tmp2.jpg' となります。 クオーテーション「 ' 」なしで、クリップボードに保存したいのですが どのようにすれば良いのでしょうか。 rest of characters of などを使ってどうにか組もうとしたのですが 初心者にはできませんでした。 どなたか、よろしくお願いします。 tell application "Finder" set theItems to "__OBJ_PATH__" set theResult to "" set old_delims to AppleScript's text item delimiters set AppleScript's text item delimiters to ":" set max to count of (every text item of theItems) repeat with num from 1 to max set theResult to theResult & quoted form of (text item num of theItems) if max > 1 and num < max then set theResult to "theResult" & " " end if end repeat set AppleScript's text item delimiters to old_delims set the clipboard to theResult end tell

  • AppleScriptで

    AppleScriptで jとgはtext変数、 iはinteger変数なんですが、 gのi単語目をjのi単語目に書き換えたいのですが set word i of g to word i of j で行うとエラーになります。 どうすれbくぁいいのでしょうか。

    • 締切済み
    • Mac
  • 動的な変数名のつけ方について

    ■環境 OS:XP 言語:C++ コンパイラ:Visual C++ 2008 char*やstd::string等で格納された文字列を使用して 変数を宣言することは可能でしょうか。 用途として、テキストファイル等から文字列を取得し その文字列を変数名としてプログラミング内で使用するという方法を考えています。 よろしくお願い致します。

  • ユーザーフォームで使うコンボボックスの変数について

    ユーザーフォームで使うコンボボックスの変数について お世話になります。 エクセル2003で、ユーザーフォームを使った入力を考えています。 vbaのコードを作成中なのですが、 素人ながらFor Next とWithをつかった構文で 作り始めています。 作成中にふと思い、質問させていただきました。 ---------------------------------------------- Private Sub UserForm_Initialize() Dim i1 As Single Dim i2 As Integer With ComboBox101 For i1 = 5 To 40 Step 2.5 .AddItem i1 Next End With With ComboBox102 For i2 = 1 To 10 .AddItem i2 Next End With With ComboBox103 For i2 = 1 To 6 .AddItem i2 Next End With With ComboBox104 For i2 = 1 To 10 .AddItem i2 Next End With End Sub ---------------------------------------------- 上記コードにおいて、 ComboBox101については、小数以下の値が必要なため、変数はSingle 他のものについては、整数のため、Integerとなります。 ComboBox103から、変数の条件が同じため、そのまま同じ変数を使用しております。 個々のコンボボックスがWithで囲まれており、なおかつその中にFor Nextが含まれていますので、 問題はないのかなぁと思っていますが、はっきりとした確信が持てません。 コンボボックスでのドロップダウンリストを作成する際、この変数の再利用については 問題ありませんでしょうか? ご存知の方がいましたら、教えてください。よろしくお願いします。

  • 変数を動的に作るには?

    変数を作成する際には必要な分だけ一つずつ宣言する必要があるのでしょうか? 例えば、連番を格納する文字列型変数を一時的に100個必要だとすると Dim textdat1 As String = "Number1" Dim textdat2 as String = "Number2" Dim textdat3 as String = "Number3"      ・      ・      ・ と100個宣言しないといけないと思うのですがこれを For i As Integer = 1 To 100 Dim textdat(i) As String = "Number" & i Next i という様な形で変数を作成することは出来ないのでしょうか。 初歩的な質問かもしれませんが、よろしくお願いします。

  • 変数

    ポインタ変数なんですが、 int *p;と宣言した時 自分自身のアドレスを持ってますか?(プログラムが終わるまで?) ポインタ変数は、他の変数アドレスを格納しますよね。 また数値の値も格納しますよね。 これは、ポインタ変数宣言 時の自分のアドレスに、 他の変数のアドレス、数値の値、 と二つを格納しているのですか? ポインタ自身のアドレス出力は(int *pの時) printf("%p",&p); 他の変数のアドレス出力は(p=&の時) printf("%p",p); であってますか? 普通の変数は、自身のアドレス、数値の値、だけ、 ポインタ変数はさらに、他の変数の値を格納していますか? 教えてください。

  • indesignでのapplescript

    はじめまして、indesign CS3で使用するapplescriptに関しての質問です。 自動で出力をしてくれるスクリプトを作りたいと思い、やってみたのですがうまくいきません。 色々調べて作ってみたのがこれです。 tell application "Finder" set filesInFolder to files in (choose folder) repeat with theFile in filesInFolder if name extension of theFile is "indd" then -- 拡張子を指定 set priset to "B4" -- プリントプリセットを指定 tell application "Adobe InDesign CS3" activate open theFile tell document 1 print using priset without print dialog close saving no end tell end tell end if end repeat end tell ここまではなんとかできたのですが、現段階では1階層下までのinddドキュメントしか読取ってくれません。 1見開きごとにパッケージしてできた子フォルダを一つの親フォルダにまとめることが多いので、フォルダ▶フォルダ▶.inddになります。 これでは親フォルダを指定したときに2階層下の子フォルダに分かれて入っている複数の.inddを一気に出力することができません。 何か解決策はありませんでしょうか? また、現段階に関してのご指摘もございましたらよろしくお願いします。

  • AppleScriptファイルの読み書きについて

    Applescriptを始めたばかりの初心者です。 テキストファイルを読み込んで、検索置換を行うスクリプトを作成してます。 検索置換まではなんとかできたのですが、ファイルを同じ場所に同じ名前で上書きしたいのですが、うまくいきません。見よう見まねで作成しているので、エラーがでても対処できませんでした。 どうかアドバイスをお願いします。 set thefile to "■■HD:0000:0000.txt"--いつも同じファイルを読み込む try set fn to open for access file thefile with write permission set mystr to read fn -- 全ての内容を得る end try display dialog mystr--内容の確認 set mystr to my replaceAll(mystr, "▼", return) display dialog mystr--内容の確認 write mystr to fn close access fn on replaceAll(motoStr, findStr, repStr) set OriginalDelimiters to AppleScript's text item delimiters set AppleScript's text item delimiters to {findStr} set motoStr to text items of motoStr set AppleScript's text item delimiters to {repStr} set motoStr to motoStr as string set AppleScript's text item delimiters to OriginalDelimiters return motoStr end replaceAll

  • AppleScript で・・

    お世話になります。 OS10.6環境で“システム環境設定”の“日付と時刻”を開けるAppleScriptをエディターで作製してみるのですが、エラーが出て(error "System Preferences でエラーが起きました:pane \"com.apple.DateAndTIme\" を pane \"com.apple.DateAndTIme\" に設定できません。" number -10006 from pane "com.apple.DateAndTIme")“日付と時刻”まで行き着きません、他の項目はたどり着くのですが、記述に問題があるかと思いますがさっぱりです、お手数ですがアドバイスいただけると助かります。 ー以下スクリプトー tell application "System Preferences" activate set current pane to pane "com.apple.dateandtime" end tell ー以上ー 例えば "com.apple.dateandtime"のdateandtimeをnetworkにすればネットワークが開くのですが・・

    • ベストアンサー
    • Mac

専門家に質問してみよう