Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

タグ: 15.0savvy

Claris FileMaker Pro 2025(v22)がリリースされた

Posted on 7月 12 by Takaaki Naganoya

Appleの子会社であるClarisから、Claris FileMaker Pro 2025(v22)がリリースされました。

AppleScript名:Claris FileMaker Pro 2025のバージョン番号取得.scpt
tell application "FileMaker Pro"
  version
  
–> "22.0.1"
end tell

★Click Here to Open This Script 

AppleScript用語辞書は前バージョンから変更されていません。

Posted in news | Tagged 14.0savvy 15.0savvy 26.0savvy | Leave a comment

ASCII ARTで直線を引く v3.1

Posted on 7月 8 by Takaaki Naganoya

ASCII ARTで指定の2点間に線を引くAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで直線を引く v3.1.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/07
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

property widthCount : 40
property heightCount : 25
property spaceChar : " "
property drawChar : "■"

— 使用例
set canvas to makeBlankCanvas() of me

set canvas to drawLine(canvas, 0, 0, 39, 24, 1) of me — 太さ1の線

set curDelim to AppleScript’s text item delimiters
set AppleScript’s text item delimiters to return
set resultText to canvas as text
set AppleScript’s text item delimiters to curDelim

return resultText

on makeBlankCanvas()
  set blankLine to ""
  
repeat widthCount times
    set blankLine to blankLine & spaceChar
  end repeat
  
set canvas to {}
  
repeat heightCount times
    set end of canvas to blankLine
  end repeat
  
return canvas
end makeBlankCanvas

on drawLine(canvas, x0, y0, x1, y1, thickness)
  script spd
    property drawnPositions : {}
    
property drawXCoords : {}
    
property canvas : {}
    
property lineChars : {}
  end script
  
  
copy canvas to (canvas of spd)
  
  
set dx to x1 – x0
  
set dy to y1 – y0
  
set lineLength to (dx * dx + dy * dy) ^ 0.5
  
  
if lineLength = 0 then
    if x0 ≥ 0 and x0 < widthCount and y0 ≥ 0 and y0 < heightCount then
      set theLine to item (y0 + 1) of (canvas of spd)
      
set newLine to replaceCharAt(theLine, x0 + 1, drawChar)
      
set item (y0 + 1) of (canvas of spd) to newLine
    end if
    
    
return (canvas of spd)
  end if
  
  
set nx to –dy / lineLength
  
set ny to dx / lineLength
  
  
set halfThickness to (thickness – 1) / 2
  
if halfThickness < 0 then set halfThickness to 0
  
  
set x to x0
  
set y to y0
  
  
set dxAbs to absNum(dx) of me
  
set dyAbs to absNum(dy) of me
  
set sx to signNum(dx) of me
  
set sy to signNum(dy) of me
  
set err to dxAbs – dyAbs
  
  
set (drawnPositions of spd) to {}
  
  
repeat
    set (drawXCoords of spd) to {}
    
repeat with t from –halfThickness to halfThickness
      set pxF to x + nx * t
      
set pxInt to pxF as integer
      
if pxInt ≥ 0 and pxInt < widthCount then
        if (drawXCoords of spd) does not contain pxInt then
          set end of (drawXCoords of spd) to pxInt
        end if
      end if
    end repeat
    
    
set pyInt to y as integer
    
if pyInt ≥ 0 and pyInt < heightCount then
      set theLine to item (pyInt + 1) of (canvas of spd)
      
set (lineChars of spd) to characters of theLine
      
      
repeat with pxInt in (drawXCoords of spd)
        set posKey to (pxInt as string) & "," & (pyInt as string)
        
        
if (drawnPositions of spd) does not contain posKey then
          set item (pxInt + 1) of (lineChars of spd) to drawChar
          
set end of (drawnPositions of spd) to posKey
        end if
        
      end repeat
      
      
set newLine to (lineChars of spd) as string
      
set item (pyInt + 1) of (canvas of spd) to newLine
    end if
    
    
if x = x1 and y = y1 then exit repeat
    
    
set e2 to 2 * err
    
if e2 > –dyAbs then
      set err to err – dyAbs
      
set x to x + sx
    end if
    
    
if e2 < dxAbs then
      set err to err + dxAbs
      
set y to y + sy
    end if
  end repeat
  
  
return (canvas of spd)
end drawLine

on replaceCharAt(str, pos, char)
  if pos < 1 or pos > (length of str) then return str
  
set prefix to text 1 thru (pos – 1) of str
  
set suffix to text (pos + 1) thru -1 of str
  
return prefix & char & suffix
end replaceCharAt

on absNum(n)
  if n < 0 then return –n
  
return n
end absNum

on signNum(n)
  if n > 0 then return 1
  
if n < 0 then return -1
  
return 0
end signNum

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy 26.0savvy | Leave a comment

ASCII ARTで円を塗る

Posted on 7月 5 by Takaaki Naganoya

ASCII ARTで円を塗りつぶすAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで円を塗る.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/04
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

— 円の半径 (この数値を変更すると円の大きさが変わります)
set radiusNum to 12

— キャンバスのサイズ
set canvasWidth to 80
set canvasHeight to 40

— 円の中心座標
set centerX to canvasWidth / 2
set centerY to canvasHeight / 2

— 全角文字のアスペクト比補正係数
set aspectRatio to 0.7
set aaRes to aaFillCircle(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio) of me

on aaFillCircle(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio)
  script spd
    property outputText : ""
  end script
  
  
— 描画結果を格納する変数
  
set (outputText of spd) to ""
  
  
— 描画処理 (1行ずつ文字を生成)
  
repeat with y from 1 to canvasHeight
    set currentLine to ""
    
repeat with x from 1 to canvasWidth
      — 円の方程式を使い、中心からの距離を計算
      
set distSquared to ((x – centerX) * aspectRatio) ^ 2 + (y – centerY) ^ 2
      
      
— 現在の座標が円の内側または円周上にあるか判定
      
if distSquared ≤ radiusNum ^ 2 then
        set currentLine to currentLine & "■"
      else
        set currentLine to currentLine & " "
      end if
    end repeat
    
— 1行分の文字列と改行を出力に追加
    
set (outputText of spd) to (outputText of spd) & currentLine & "
"
  end repeat
  
  
return contents of (outputText of spd)
end aaFillCircle

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

ASCII ARTで円を線で描く

Posted on 7月 5 by Takaaki Naganoya

ASCII ARTで円を線で描くAppleScriptです。(デモ用の)文字で表現するゲームを作る場合に、基礎ルーチンを整備しておく必要性を感じて、書いておきました。

AppleScript名:ASCII ARTで円を線で描く.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/07/04
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use scripting additions

set radiusNum to 12

— キャンバスのサイズ
set canvasWidth to 80
set canvasHeight to 40

— 円の中心座標
set centerX to canvasWidth / 2
set centerY to canvasHeight / 2

— 全角文字のアスペクト比補正係数
set aspectRatio to 0.7

— 描画する線の太さ
set lineWidth to 0.5
set ssRes to aaDrawCircleLine(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio, lineWidth) of me

on aaDrawCircleLine(radiusNum, canvasWidth, canvasHeight, centerX, centerY, aspectRatio, lineWidth)
  script spd
    property outputText : ""
  end script
  
  
— 描画結果を格納する変数
  
set (outputText of spd) to ""
  
  
— 描画処理 (1行ずつ文字を生成)
  
repeat with y from 1 to canvasHeight
    set currentLine to ""
    
repeat with x from 1 to canvasWidth
      — 円の方程式を使い、中心からの距離を計算
      
set distSquared to ((x – centerX) * aspectRatio) ^ 2 + (y – centerY) ^ 2
      
      
— 現在の座標が円周上にあるか判定
      
if (distSquared > (radiusNum – lineWidth) ^ 2) and (distSquared < (radiusNum + lineWidth) ^ 2) then
        set currentLine to currentLine & "■"
      else
        set currentLine to currentLine & " "
      end if
    end repeat
    
— 1行分の文字列と改行を出力に追加
    
set (outputText of spd) to (outputText of spd) & currentLine & "
"
  end repeat
  
return contents of (outputText of spd)
end aaDrawCircleLine

★Click Here to Open This Script 

Posted in Text | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

Appleに買収されたPixelmator ProがAppleとしての初アップデート

Posted on 7月 2 by Takaaki Naganoya

前回の「買収されました」メッセージを表示するだけのアップデートとは異なり、Apple体制下でのそれらしいアップデート(v3.7)が行われました。

AppleScript用語辞書にも変更が加わっているのですが、

Pixelmatorの各バージョンに設定されていたコードネームを返してくるコマンドが廃止になったようです。そんな機能があったとは知りませんでした。廃止はまぁ、機能的に何も影響がないので妥当なところだろうかと。

Posted in Update | Tagged 13.0savvy 14.0savvy 15.0savvy Pixelmator Pro | Leave a comment

NLTaggerで品詞つきの日本語形態素解析

Posted on 6月 30 by Takaaki Naganoya

ChatGPTに日本語形態素解析のAppleScriptを書かせてみました。そのままでは使い物にならず、ずいぶん書き直しましたが、ゼロから書くよりは時間の節約になっています。

ただし、実際に書いて動かしてみるとNLTaggerでは日本語の品詞情報が取得できないので、ほぼ役に立ちません。MeCab経由で取得したほうが実用的です。

この状態で「なんちゃらIntelligence」とか言われても、「はぁ?」としか、、、基礎ができていないのに応用はできませんよ。

AppleScript名:NLTaggerで品詞つきの日本語形態素解析(ただし、品詞はほとんど役に立たない).scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/06/30
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.8" — macOS 12 or later
use framework "Foundation"
use framework "NaturalLanguage"
use scripting additions

set inputText to current application’s NSString’s stringWithString:"私は昨日東京に行きました。"

— NLTaggerの作成(品詞情報を取得したいのでLexicalClassを指定)
set tagger to current application’s NLTagger’s alloc()’s initWithTagSchemes:{current application’s NLTagSchemeLexicalClass}
tagger’s setString:inputText
tagger’s setLanguage:(current application’s NLLanguageJapanese) range:{location:0, |length|:(inputText’s |length|())}

— 結果を格納するリスト
set tokenList to {}

— 解析処理
set inputLength to (inputText’s |length|()) as integer
set currentIndex to 0

repeat while currentIndex < inputLength
  set tokenRangeRef to reference
  
set {tagRes, theRange} to tagger’s tagAtIndex:(currentIndex) unit:(current application’s NLTokenUnitWord) |scheme|:(current application’s NLTagSchemeLexicalClass) tokenRange:(tokenRangeRef)
  
–return theRange
  
  
set theRange to theRange as record
  
set startLoc to theRange’s location
  
set rangeLen to theRange’s |length|()
  
  
if (rangeLen > 0) then
    set tokenText to inputText’s substringWithRange:(current application’s NSMakeRange(startLoc, rangeLen))
    
if tagRes is not missing value then
      set posStr to tagRes as string
    else
      set posStr to "Unknown"
    end if
    
set endIndex to startLoc + rangeLen
    
set end of tokenList to {(tokenText as string), posStr}
    
set currentIndex to endIndex
  else
    exit repeat
  end if
end repeat

return tokenList
–> {{"私", "OtherWord"}, {"は", "OtherWord"}, {"昨日", "OtherWord"}, {"東京", "OtherWord"}, {"に", "OtherWord"}, {"行き", "OtherWord"}, {"まし", "OtherWord"}, {"た", "OtherWord"}, {"。", "SentenceTerminator"}}

★Click Here to Open This Script 

Posted in Natural Language Processing | Tagged 15.0savvy 26.0savvy NLTagger | Leave a comment

macOS 26, 15.5でShortcuts.app「AppleScriptを実行」アクションのバグが修正される

Posted on 6月 10 by Takaaki Naganoya

macOS 15.xで続いていた、Shortcuts.appの「AppleScriptを実行」アクションにおいて、デフォルト入力されるべきハンドラなどのScriptが新規追加時に入力されないバグが、修正されたようです。

これは、macOS 26BetaのShortcuts.app上で本バグが修正されていたことから、macOS 15.5上のShortcuts.appの再確認を行ったところ、実際に修正されていることが明らかになりました。

macOS 15.5上のShortcuts.app ようやく「AppleScriptを実行」アクションのバグが修正されたもよう

Posted in Bug | Tagged 15.0savvy 26.0savvy Shortcuts | Leave a comment

Keynoteの各slideのtitleで、章番号を振り直す v2

Posted on 6月 5 by Takaaki Naganoya

Keynote書類で選択中のスライド(ページ)において、default title itemからテキストを取り出し、正規表現で数字を抽出し、章番号(数字+章)を振り直すAppleScriptです。

本ScriptはmacOS 15.5+Keynote 14.4で動作確認を行なっていますが、バージョン依存する部分はほとんどないので、もっと前のバージョンでも動作することでしょう。本Scriptの動作には、BridgePlus AppleScript Libraryを必要とします。

このサンプルのKeynote書類では、ウィンドウ左端に表示させた「ナビゲータ」の階層表示の機能を利用して、一番上の階層(章トビラなど)だけを選択できるようになっています(そのように編集)。


▲スライドごとに階層構造になっているKeynote書類。章トビラ、記事トビラ、記事といった構造になっている

そのため、このナビゲータ上の階層を最上位のものだけ表示させると、最上位の章トビラだけを選択できます。

この状態で、章トビラのスライドだけを選択した状態で、本AppleScriptを実行すると、スライドのdefault tile item(タイトルが入るテキストボックス)に書かれた「1章」「2章」といった文字を読み取って、範囲内の最小の数値と最大の数値を検出し、冒頭から「1章」「2章」と章番号を割り振り直します。

Keynote書類の編集中に章構成に変更が発生し、章番号の割り振りをやり直す必要がある場合のために作成したものです。

AppleScript名:Keynoteの各slideのtitleで、章番号を振り直す v2.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/06/04
—
–  Copyright © 2021 Piyomaru Software, All Rights Reserved
–  本バージョンから、Keynoteのスライドのdefault title itemへの描き戻しをサポート

use AppleScript version "2.8"
use framework "Foundation"
use scripting additions
use bPlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html

property NSStringTransformFullwidthToHalfwidth : a reference to current application’s NSStringTransformFullwidthToHalfwidth

load framework

–選択中のスライドのタイトルとスライドオブジェクトを取得
set {aList, aSel} to getTitleAndObjFromSelectedSlides() of me
if {aList, aSel} = {false, false} then error "Keynote書類内のスライド選択状態に異常あり"

–抽出したタイトルから章番号のみ取得し、最小値/最大値/枚数などの情報を取得
set nList to {}
repeat with i in aList
  set j to contents of i
  
set n to filterNumStr(j) of me
  
set the end of nList to n
end repeat

set minRes to calcMin(nList) of me
set maxRes to calcMax(nList) of me
set countRes to maxRes – minRes + 1
set gapRes to calcGaps(nList) of me
log {minRes, maxRes, countRes, gapRes} –最小値、最大値、枚数、連番からの数値抜け(リスト)
–> {1, 30, 30, {13}}

–章番号を振り直すデータを作成。選択範囲内の最小の章番号から1ずつインクリメントして章番号を付与
set n2List to {}
set aCount to minRes
repeat with i in aList
  if aCount < 10 then
    –1桁の数の場合には、全角数字を使用する
    
set aNumStr to hanToZen(aCount as string) of me
  else
    copy aCount to aNumStr
  end if
  
  
set the end of n2List to ((aNumStr as string) & "章")
  
  
set aCount to aCount + 1
end repeat
–return n2List

–選択中のスライドの各タイトルに章番号を振り直し
setEachTitlesToListedSlides(n2List, aSel) of me

–Keynoteの各slideのタイトルを取得する
on getTitleAndObjFromSelectedSlides()
  
  
set aList to {}
  
set selectedTitles to {}
  
  
tell application "Keynote"
    tell front document
      set aSel to selection
      
      
–エラーチェック
      
if length of aSel ≤ 1 then
        display dialog "連番を振り直す対象のスライドが複数枚数選択されていないので処理終了します" buttons {"OK"} default button 1 with icon 1
        
return {false, false}
      end if
      
      
set aFirstClass to class of contents of first item of aSel
      
if aFirstClass is not equal to slide then
        display dialog "スライド単位で選択されていないので処理終了します" buttons {"OK"} default button 1 with icon 1
        
return {false, false}
      end if
      
      
–スライドの逆順選択が発生していた場合には、listを逆順に入れ替えて正順(開始ページ→終了ページ)に修正  
      
set fItem to slide number of first item of aSel
      
set lItem to slide number of last item of aSel
      
if fItem > lItem then set aSel to reverse of aSel
      
      
–選択中のスライドのタイトル(default title item)
      
repeat with i in aSel
        tell i
          try
            set tmpStr to object text of default title item
          on error
            set tmpStr to ""
          end try
        end tell
        
        
set the end of aList to tmpStr
      end repeat
      
      
return {aList, aSel}
    end tell
  end tell
end getTitleAndObjFromSelectedSlides

on setEachTitlesToListedSlides(newList, aSel)
  –連番を振り直したリストを元に、Keynoteの各slideのtitleを変更する
  
set aCount to 1
  
tell application "Keynote"
    tell document 1
      repeat with i in aSel
        tell i
          set object text of default title item to (contents of item aCount of newList)
        end tell
        
set aCount to aCount + 1
      end repeat
    end tell
  end tell
end setEachTitlesToListedSlides

on filterRealNumStr(aStr as string)
  set regStr to "\\d+\\.\\d+"
  
set aRes to findStrByPattern(aStr, regStr) of me
  
return aRes as real
end filterRealNumStr

on filterNumStr(aStr as string)
  set aLen to length of aStr
  
set regStr to "\\d{1," & (aLen as string) & "}"
  
set aRes to findStrByPattern(aStr, regStr) of me
  
return aRes as {boolean, number}
end filterNumStr

on findStrByPattern(aText as string, regStr as string)
  set anNSString to current application’s NSString’s stringWithString:aText
  
set aRange to anNSString’s rangeOfString:regStr options:(current application’s NSRegularExpressionSearch)
  
if aRange = {location:0, length:0} then return ""
  
set bStr to anNSString’s substringWithRange:aRange
  
return bStr as string
end findStrByPattern

on calcMax(aList as list)
  set tmpFItem to first item of aList
  
set aClass to class of tmpFItem
  
  
set nArray to current application’s NSMutableArray’s arrayWithArray:aList
  
if aClass = real then
    set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubeValue()
  else
    set maxRes to (nArray’s valueForKeyPath:"@max.self")’s intValue()
  end if
  
  
return maxRes
end calcMax

on calcMin(aList as list)
  set tmpFItem to first item of aList
  
set aClass to class of tmpFItem
  
  
set nArray to current application’s NSMutableArray’s arrayWithArray:aList
  
if aClass = real then
    set maxRes to (nArray’s valueForKeyPath:"@min.self")’s doubeValue()
  else
    set maxRes to (nArray’s valueForKeyPath:"@min.self")’s intValue()
  end if
  
  
return maxRes
end calcMin

on calcGaps(aList as list)
  set nArray to (current application’s NSMutableArray’s arrayWithArray:aList)
  
set maxRes to (nArray’s valueForKeyPath:"@max.self")’s intValue()
  
set minRes to (nArray’s valueForKeyPath:"@min.self")’s intValue()
  
  
–最小値から最大値までの連番リスト作成
  
set theIndexSet to current application’s NSIndexSet’s indexSetWithIndexesInRange:{minRes, maxRes}
  
set theList to (current application’s SMSForder’s arrayWithIndexSet:theIndexSet) as list
  
  
–補集合
  
set aSet to current application’s NSMutableSet’s setWithArray:theList
  
set bSet to current application’s NSMutableSet’s setWithArray:nArray
  
aSet’s minusSet:bSet
  
  
return aSet’s allObjects() as list
end calcGaps

–半角→全角変換
on hanToZen(aStr as string)
  set aString to current application’s NSMutableString’s stringWithString:aStr
  
return (aString’s stringByApplyingTransform:(current application’s NSStringTransformFullwidthToHalfwidth) |reverse|:true) as string
end hanToZen

–全角→半角変換
on zenToHan(aStr as string)
  set aString to current application’s NSMutableString’s stringWithString:aStr
  
return (aString’s stringByApplyingTransform:(current application’s NSStringTransformFullwidthToHalfwidth) |reverse|:false) as string
end zenToHan

★Click Here to Open This Script 

Posted in Object control regexp Text | Tagged 15.0savvy Keynote | Leave a comment

デフォルトタイトルと重なっているものと指定サイズのものを抽出

Posted on 5月 26 by Takaaki Naganoya

Keynote書類上でタイトルと(ボックスの領域が)重なるテキスト、および文字サイズが指定サイズと同じテキストを抽出してまとめるAppleScriptを書いてみました。Keynoteで作成した電子書籍の目次データ確認のためのものです。

実行はmacOS 15.5+Keynote v14.4上で行いましたが、とくにバージョン依存している箇所はないので、異なるバージョンであっても使えるはずです。分析対象の書類をKeynoteでオープンした状態で、解析対象のスライド(複数)を選択した状態でスクリプトエディタ上で実行することを前提にしています。

Keynoteのスライド(ページ)からのテキスト抽出は、Cocoaの機能が利用できるようになってからずいぶんと楽になりました。boundsが重なっているものを演算で判別するのも楽勝です。

以下は、執筆中の最新刊「AppleScript+Xcode GUIアプリソース集」の内容にもとづいています(未完成)。

# 同書の作業中、その暫定タイトル名からmacOS 15.5BetaのAppleScript処理系のクラッシュを誘発したといういわくつきのタイトルでもあります(同バグはリリース時に修正されました)

99ソースの部分はまだ添付Xcodeプロジェクトを確認していないので、「だいたいそのぐらいだろう」という暫定値でもあります。

この状態でウィンドウ左側のカバーページ部分だけを選択すると、selectionでカバーページだけを抽出できます。

カバーページに対して、デフォルトタイトルアイテム(ここでは章番号が入る)と、そのエリアに重なっているテキストアイテムを抽出。

さらに、中央に配置している96ポイントのテキストアイテムを抽出。

あとは、Keynote(iWorks Apps)でよくあるテキストアイテムから抽出したテキストに謎コード(iWork共通のオブジェクト内強制改行)が入っていて改行を解除できないという問題にも対処しています。

また、KeynoteなどのiWork Apps共通の問題点である「オブジェクト同士のIDによる識別ができない」点については、propertiesでまとめて属性値を取得し、この属性値でまとめて判定を行っています。少々遅くなりそうな感じでしたが、実際に試してみたら(マシンが速いので?)問題ありませんでした。

1章 さあ、はじめよう!
基礎的な内容のご説明
2章 ウィンドウ
各種部品を格納する基本的な部品
3章 ボタン
クリック操作を受け付けるもっとも基本的な部品
4章 テキストフィールド
文字や数値などの入力を受け付け、表示を行う
5章 テキストビュー
複数行のスタイルつきテキストを扱える入力・表示部品
6章 デートピッカー
カレンダー情報の入力を受け付ける
7章 イメージビュー
画像(色)の表示とドラッグ&ドロップ受け付け
8章 パスコントロール
フォルダやファイルパスのユーザーによる選択や表示
9章 スライダー
数値の入力、表示
10章 プログレスインジケータ
App Storeに出すなら必須の途中経過表示部品
11章 テーブルビュー
表データの表示、入力用ぜひ使いたい部品
12章 アウトラインビュー
階層化データの入力、表示用
13章 ブラウザ
ツリーデータ、フォルダ階層構造の表示・選択
14章 スプリットビューほか
複数のGUI部品をまとめて使いやすく
15章 メニュー
アプリの機能をひととおり呼び出す階層メニュー
16章 ポップオーバー
ボタンなどからオーバーレイ表示する簡易子ウィンドウ
17章 アドレスブックピープルピッカー
住所録データを表示・選択する
18章 AVキットプレイヤービュー
各種ムービーを再生表示
19章 マップキットビュー
場所と倍率と形式を指定して世界地図を表示
20章 OSAキットビュー
スクリプトエディタ部品でAS編集・実行
21章 PDFキットビュー
PDFとサムネイル表示
22章 ウェブキットビュー
Webコンテンツの表示と操作
23章 サービス
各アプリに対して共通で機能を提供する
24章 ドキュメントベースアプリ
「書類」を扱うアプリ形式
25章 外部アプリコントロール
AppleScriptで他のGUIアプリを操作
26章 スクリプタブル化
アプリ自体を外部からAppleScriptで操作可能に
27章 アプリアイコン
Dock上に表示するアプリアイコンを操作する
28章 ダイアログ
文字入力ダイアログを表示して文字入力
29章 アニメーション
GUI部品をアニメーションさせてユーザーの操作を促す
30章 その他
その他のこまごまとした実用的なノウハウ
あとがき、奥付 Author’s notes
ご愛読、ご協力感謝申し上げます。

すべて自分で作ったデータなので、非常に「ゆらぎ」が小さくなっており、そのデータ品質を前提に作っています。

実際にはもっとデータ品質が低いものと思われるため、そうした低品質データに対処するためには、もっといろいろな処理が必要になってくることでしょう。

処理対象データ(ここではKeynote書類)が事前に予想したとおりの構造(default title item使用)や品質(データのばらつきの存在)になっているかは、AppleScriptを何回か走らせてデータの内容を確認するものでもあるため、最初から一発で想定どおりの処理ができるわけではありません。

AppleScript名:デフォルトタイトルと重なっているものと指定サイズのものを抽出.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/05/26
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set targSize to 96.0 –取り出し対象の文字サイズ
set outList to ""

tell application "Keynote"
  tell front document
    set aSel to selection
    
repeat with i in aSel
      set j to contents of i
      
      
tell j
        set tList to every text item
        
        
set dItem to default title item
        
set dProp to properties of dItem
        
set dText to object text of dItem –テキスト
        
        
set dPos to position of default title item
        
set dHeight to height of default title item
        
set dWidth to width of default title item
        
set dList to dPos & {dWidth, dHeight}
        
        
–座標領域が重なっているオブジェクトを抽出
        
set colList to {}
        
repeat with ii in tList
          set jj to contents of ii
          
set tPos to position of jj
          
set tHeight to height of jj
          
set tWidth to width of jj
          
set ttList to tPos & {tHeight, tHeight}
          
set tProp to properties of jj
          
          
if dProp is not equal to tProp then
            set gCol to getCollision(dList, ttList) of me
            
if gCol = true then
              set the end of colList to jj
            end if
          end if
        end repeat
        
        
–指定フォントサイズのテキストアイテムを抽出
        
set sizeList to {}
        
repeat with ii in tList
          set jj to contents of ii
          
set tSize to size of object text of jj
          
if tSize = targSize then
            set the end of sizeList to jj
          end if
        end repeat
        
        
–出力用テキストの整形
        
set t1 to cleanUpKeynoteTextObj(dText) of me
        
set t2 to cleanUpKeynoteTextObj(object text of item 1 of sizeList) of me
        
set t3 to cleanUpKeynoteTextObj(object text of item 1 of colList) of me
        
        
set outStr to t1 & tab & t3 & return & t2
        
set outList to outList & return & outStr
        
      end tell
    end repeat
  end tell
end tell

return outList

–iWorkのtext itemのオブジェクト内改行を削除
on cleanUpKeynoteTextObj(tObj)
  set tObj to repChar(tObj, string id 10, "") of me –LF
  
set tObj to repChar(tObj, string id 13, "") of me –CR
  
set tObj to repChar(tObj, string id 8232, "") of me –強制改行?
  
return tObj
end cleanUpKeynoteTextObj

on getCollision(aList, bList)
  copy aList to {aXn, aYn, aWn, aHn}
  
copy bList to {bXn, bYn, bWn, bHn}
  
  
set a4Rect to current application’s NSMakeRect(aXn, aYn, aWn, aHn)
  
set b4Rect to current application’s NSMakeRect(bXn, bYn, bWn, bHn)
  
set a4Res to detectRectanglesCollision(a4Rect, b4Rect) of me
  
  
return a4Res
end getCollision

–NSRect同士の衝突判定
on detectRectanglesCollision(aRect, bRect)
  set a1Res to (current application’s NSIntersectionRect(aRect, bRect)) as {record, list}
  
set tmpClass to class of a1Res
  
  
if tmpClass = record then
    –macOS 10.10, 10.11, 10.12
    
return not (a1Res = {origin:{x:0.0, y:0.0}, |size|:{width:0.0, height:0.0}})
  else if tmpClass = list then
    –macOS 10.13 or later
    
return not (a1Res = {{0.0, 0.0}, {0.0, 0.0}})
  end if
end detectRectanglesCollision

on repChar(origText as string, targStr as string, repStr as string)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

★Click Here to Open This Script 

Posted in bounds list | Tagged 15.0savvy Keynote | Leave a comment

macOS 15.5beta4で報告済みのバグ何も直らず

Posted on 4月 29 by Takaaki Naganoya

macOS 15.5beta4が配信されましたが、とくに報告ずみのバグは何も直っていません。15.5台では直らないというよりも、バグとして認識していないんじゃないでしょうか?

正式リリースされたようですが、アクセシビリティの音声コマンドが動作していないバグについては、修正されていません。

Posted in Bug news | Tagged 15.0savvy | Leave a comment

【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ

Posted on 4月 21 by Takaaki Naganoya

特定のパターンのファイル名のパスをaliasにcastする処理で処理系まるごとクラッシュするというmacOS 15.5β版(15.5 Beta(24F5053f))のバグ。

もっと以前から存在していたのかもしれませんが、特定のファイル名だとクラッシュを引き起こす前代未聞のバグがすごすぎて、いろいろ調べてみました。

文字依存する箇所はごくわずかで、いろいろ規則性があることがわかってきました。

・15.5 Beta(24F5053f)の日本語ユーザー環境(Primary LanguageをJapaneseにした状態)で発生。英語環境に変更すると発生しない
・ファイルパスをaliasにcastすると即・クラッシュ
・アルファベットとひらがな/カタカナが混在している必要がある???
・拡張子の種別は関係なく発生
・一定の文字数以上の長さが必要
・決定的な問題を引き起こすのは、濁点/半濁点つきのひらがな/カタカナが入っていること
・当初、記号文字やスペースが入っていることが条件かと思っていたが、これらを除去しても発生
・濁点/半濁点つき文字はファイル名の特定文字数以降に登場する必要がある。冒頭に移動させてもクラッシュは発生しない
・同じ処理内容のJXAでもクラッシュが発生する
・これらのクラッシュを誘発するファイル名がフォルダ名についていてもクラッシュは発生しない

現時点でクラッシュを発生させる最低限のファイル名は、

AAXAAXXあああああああああパ1.txt

であることを確認しています。

追記:
macOS 15.5β3(24F5053j)でも継続して発生中です。

追記:
macOS 15.5正式リリース時には解消されました。

Posted in Bug news | Tagged 15.0savvy | Leave a comment

macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ

Posted on 4月 19 by Takaaki Naganoya

きわめて珍しいパターンのバグに遭遇しました。自分の手元のmacOS 15.5Beta2環境(Apple Silicon Mac x 2)では再現率100%です(FB17285323)。再起動しても再現し、日本語環境で発生する一方で英語環境では発生しません。日本語環境であればJXAでも同様の現象の発生を確認しています。

「AppleScript+Xcode GUIアプリ ソースブック.key」

というファイル名のKeynote書類を、macOS 15.5β(日本語ユーザー環境)+Keynote v14.4で編集。このKeynote書類のボツスライドの移動用の「没.key」という書類をもとの書類の同階層に同じスタイルで作成するAppleScriptをスクリプトメニューから実行したところ、これがクラッシュ。

ねんのために、PagesとNumbersでも同様のテストを行なったところ、予想どおり100%クラッシュ。

これまでのmacOSでは遭遇したことのない現象だったので、原因を深掘り。

最終的に、Keynote/Pages/Numbers v14.4の書類からファイルパス(file)を取得し、そのfileをaliasにcastするとクラッシュするということが分かりました。

追記:Pixelmator Pro、CotEditorでも同様のファイル名に対して処理を行うとクラッシュすることが確認されました。

さらに追記:クラッシュを起こすパターンのファイルをchoose fileして、フルパスをstringにcastし、さらにaliasにcastするとアプリ操作に関係なくクラッシュすることが判明

さらに、ファイル名を短くしたり一部を取り出したりすることで、同様のクラッシュが発生するかどうかを調べてみたところ、

AppleScript+Xcode GUIアプリ ソースブ.key
AppleScript+Xcode GUIアプリ ソースブッ.key
AppleScript+Xcode GUIアプリ ソースブック.key
AAAAAAAA+XXXX GUIアプリ ソースブック.key
XXXXXXXX+XXXX XXXアプリ ソースブック.key
XXXXXXXX_XXXX XXXアプリ ソースブック.key
XXXXXXXX-XXXX XXXアプリ ソースブック.key
XXXXXXXX&XXXX XXXアプリ ソースブック.key
XXXXXXXX+XXXX GUIアプリ ソースブック.key
XXXXXXXX=XXXX XXXアプリ ソースブック.key

のパターンで、以下のAppleScriptを実行すると100%クラッシュが発生。スクリプトエディタでもScript Debuggerでもスクリプトメニューでも100%クラッシュ(実行プログラムのクラッシュ)します。

逆に、

AppleScript+Xcode GUIア.key
AppleScript+Xcode GUIアプ.key
AppleScript+Xcode GUIアプリ.key
AppleScript+Xcode GUIアプリ ソース.key
AppleScript+XCODE GUアプリ ソースブック.key
GUIアプリ ソースブックのコピー.key

ではクラッシュが発生しません(なんでや?)。

なんでこの組み合わせでクラッシュが発生するのか、macOS 10.12の時代に発生していた「日本語IMからのファイル名の入力時に余計なUnicode文字が入ることで、ファイル処理できなくなるバグ」の再現かと考え、このファイル名をテキストエディタにコピー&ペーストで表示させたものの、

とくに謎のゴミ文字が入力されているということはないようです。

ちなみに、「AppleScript+Xcode GUIアプリ ソースブック」は企画検討中の電子書籍です。

AppleScript名:Crash Test Script_Keynote.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

tell application "Keynote"
  tell front document
    set curFile to (file of it)
  end tell
end tell

set curFile to curFile as alias

★Click Here to Open This Script 

AppleScript名:Crash Test Script_PAGES.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

tell application "Pages"
  tell front document
    set curFile to (file of it)
  end tell
end tell

set curFile to curFile as alias

★Click Here to Open This Script 

AppleScript名:Crash Test Script_Numbers.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

tell application "Numbers"
  tell front document
    set curFile to (file of it)
  end tell
end tell

set curFile to curFile as alias

★Click Here to Open This Script 

AppleScript名:Crash Test Script_Pixelmator Pro.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

tell application "Pixelmator Pro"
  tell front document
    set curFile to (file of it)
  end tell
end tell

set curFile to curFile as alias

★Click Here to Open This Script 

AppleScript名:Crash Test Script_CotEditor.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

tell application "CotEditor"
  tell front document
    set curFile to (file of it)
  end tell
end tell

set curFile to curFile as alias

★Click Here to Open This Script 

AppleScript名:only choose file.scpt
set aFol to (choose file) as string
set anAlias to aFol as alias

★Click Here to Open This Script 

Posted in Bug | Tagged 15.0savvy Keynote | 1 Comment

Skimがv1.7.9にアップデート

Posted on 4月 15 by Takaaki Naganoya

オープンソースのPDFビューワー「Skim」がv1.7.9にアップデートしました。AppleScript用語辞書に変更が加わっていますが、説明文が追加された程度であり機能面での変更は見られません。

Posted in news | Tagged 13.0savvy 14.0savvy 15.0savvy Skim | Leave a comment

«class isot»が復活していた?

Posted on 4月 13 by Takaaki Naganoya

Mac OS X 10.5で、dateオブジェクトをISO日付形式に変換する«class isot»が動作しなくなっていました。

ISO日付テキストからdateオブジェクトへの変換が行えなくなる

そして、もうこの機能はずっと動かなくなったままなのかと思っていましたが……現在動いていることに気づきました。

「AppleScript最新リファレンス」の初版執筆時には使えないことを確認していたので、OS X 10.11ぐらいの時代には動かなかったようです。

その後、手元の古いMacで確認してみたところ、

macOS 10.13:動く
macOS 10.14:動く

と、割と各バージョンで動いていることを確認。最新版のmacOS 15.5βでも動いています。


set testd to ((current date) as «class isot») as string
–> "2025-04-13T22:28:56"

★Click Here to Open This Script 

目下、この機能はPiyomaru Softwareの電子書籍に掲載しているコマンドリファレンスに記載していませんが、記述を復活させるべきか悩ましいところです。

個人的には、Cocoaの機能を用いてISO日付フォーマットとの相互変換を行なっています。

AppleScript名:ISO8601日付文字列を生成 v2.scptd
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"

set aDate to getDateInternational(2022, 10, 21, 0, 0, 0, "JPT") –―year, month, date, hour, minute, second, time zone abbreviation.
–> date "2022年10月21日 金曜日 0:00:00"

set bStr to retISO8601DateTimeString(aDate, "JPT") as string
–> "2022-10-21T00:00:00+09:00"

–NSDate -> ISO8601 Date & Time String
on retISO8601DateTimeString(targDate, timeZoneAbbreviation)
  set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init()
  
theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ssZZZZZ" — Five zeds to get a colon in the time offset (except with GMT).
  
theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation))
  
return (theNSDateFormatter’s stringFromDate:targDate) as text
end retISO8601DateTimeString

–Make a GMT Date Object with parameters from a given time zone.
on getDateInternational(aYear, aMonth, aDay, anHour, aMinute, aSecond, timeZoneAbbreviation)
  set theNSCalendar to current application’s NSCalendar’s currentCalendar()
  
theNSCalendar’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation))
  
set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:anHour minute:aMinute |second|:aSecond nanosecond:0
  
return theDate as date
end getDateInternational

★Click Here to Open This Script 

Posted in date | Tagged 15.0savvy | Leave a comment

AppleScript Dropletのバグっぽい動作が「復活」(macOS 15.5β)

Posted on 4月 11 by Takaaki Naganoya

ファイルのドラッグ&ドロップを受け付ける「ドロップレット」の異常動作がmacOS 10.12からずっと続いてきました。AppleScriptドロップレットに対して(Finderから)ファイルをドラッグ&ドロップすると、欠落するものが出てくるという現象です。

昨年、macOS 15.2betaか15.1あたりでこのバグが解消されたように見えました。

(確認中)AppleScript Dropletのバグっぽい動作が解消?

「見えました」というのは、一応現象としては観測できつつも、その動作を意図して実現していないんじゃないか、という懸念があったためです。つまり、Appleの現場なりマネージャー級で意思決定が行われた成果ではなさそうだ、と判定。

この動作がmacOS 15.5βで以前と同様の動作に戻っている(バグ的な動作)ことを観測しています。

on open droppedFiles
set fileCount to count of droppedFiles
display dialog “ドロップされたファイルの数: ” & fileCount buttons {“OK”} default button 1
end open

一応、ドラッグ&ドロップされたファイル/フォルダの受付で取りこぼしが出ないように対策は(Scripter側で工夫して)できているのですが、上記のように一般に知られている単純な受信コードでは対処できません。

ChatGPTをはじめとするLLMでは、上記のような単純なコードを出力することを確認しています。そして、Apple側がOSに不具合を発生させた場合にはLLMが出力するコードでは対処できません。

そして、macOSのヘルプメニューから表示できる「AppleScriptヘルプ」に書かれているドロップレットのコードがまともに動かないというのでは、話になりません。

Posted in Bug Droplet news | Tagged 15.0savvy | Leave a comment

NaturalLanguage.frameworkを用いて日本語テキストの形態素解析を行う

Posted on 4月 10 by Takaaki Naganoya

NSLinguisticTaggerの後継であるNaturalLanguage(NLTokenizer)を用いて、日本語テキストの形態素解析を行なってみました。

この手の頭を使わないプログラミングだとChatGPTに丸投げすれば、(デバッグ作業が必要な)AppleScriptのコードが出てくるので、走らせて直して……で、15分ほどでしょうか。

NLTokenizerの処理結果は、間違ってはいないものの、相変わらず固有名詞を無視しまくるので、実用レベルにあるとはいえません。自分でAppleScriptで書いた簡易日本語パーサー「easyJParse」と処理結果が変わらないので、頑張ってNLTokenizerを使う意義はほとんどないといえます(日本語を処理すると品詞情報を返して来ないので余計に……)。

AppleScript名:NaturalLanguage.frameworkを用いて日本語テキストの形態素解析を行う.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/04/10
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript
use framework "Foundation"
use framework "NaturalLanguage"
use scripting additions

set inputText to current application’s NSMutableString’s stringWithString:"私の名前は長野谷です。"

— NLTokenizerのインスタンスを作成し、単語単位で設定
set tokenizer to current application’s NLTokenizer’s alloc()’s initWithUnit:(current application’s NLTokenUnitWord)
tokenizer’s setString:inputText
tokenizer’s setLanguage:(current application’s NLLanguageJapanese)

— 解析範囲の取得
set textLength to (inputText’s |length|()) as integer
set theRange to current application’s NSMakeRange(0, textLength)

— トークンを格納するリスト
set tokenList to {}

— トークン範囲を1つずつ取得して、文字列を抽出
set currentIndex to tokenizer’s tokenRangeAtIndex:0

repeat while (currentIndex’s location < (textLength))
  set subStr to (inputText’s substringWithRange:currentIndex)
  
copy (subStr as string) to end of tokenList
  
  
— 次のトークン範囲へ進む
  
set nextIndex to (currentIndex’s location) + (currentIndex’s |length|())
  
if nextIndex ≥ textLength then exit repeat
  
set currentIndex to tokenizer’s tokenRangeAtIndex:nextIndex
end repeat

return tokenList
–> {"私", "の", "名前", "は", "長野", "谷", "です"}

★Click Here to Open This Script 

Posted in Natural Language Processing | Tagged 13.0savvy 14.0savvy 15.0savvy NLTokenizer | Leave a comment

XIBから作るステータスメニューUI

Posted on 4月 8 by Takaaki Naganoya

AppleScriptで作るステータスメニューは、プログラムで動的に作るケースが圧倒的に多いところですが、Xcode上でCocoa Applicationを作成する場合にはXIBで(=XcodeのInterface Builder上で)作ったほうが簡単だし使い勝手がいいので、作成方法を確認しておきました。


▲ステータスメニュー


▲Interface Builder上でメニューをCocoa binding(Xcode 16.3)

–> Download Archive

AppleScript名:AppDelegate.applescript
—
— AppDelegate.applescript
— statusMenuFromXIB
—
— Created by Takaaki Naganoya2 on 2025/03/27.
—
—

script AppDelegate
  property parent : class "NSObject"
  
  
— IBOutlets
  
property theWindow : missing value
  
property theStatMenu : missing value –xib上で作っておいたメニュー。Cocoa Binding
  
  
on applicationWillFinishLaunching:aNotification
    set theIcon to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer)
    
set statusItem to (current application’s NSStatusBar’s systemStatusBar())’s statusItemWithLength:(current application’s NSVariableStatusItemLength)
    
statusItem’s setTitle:("PIYOMARU")
    
statusItem’s setImage:theIcon
    
statusItem’s setHighlightMode:true
    
statusItem’s setMenu:theStatMenu
    
    
statusItem’s popUpStatusItemMenu:theStatMenu
  end applicationWillFinishLaunching:
  
  
on applicationShouldTerminate:sender
    — Insert code here to do any housekeeping before your application quits
    
return current application’s NSTerminateNow
  end applicationShouldTerminate:
  
end script

★Click Here to Open This Script 

Posted in AppleScript Application on Xcode | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

iWork Appsがバージョン14.4にアップデート

Posted on 4月 6 by Takaaki Naganoya

iWork Apps(Keynote、Pages、Numbers)がバージョン14.4にアップデートしました。各アプリのAppleScript用語辞書に変更はありません。

Pagesで継続して発生している、現在画面上で表示中のページ+2見開きのページ上のオブジェクト情報の取得/操作が行えない現象については、修正されていません。

Apple側はこれをバグとも思っていないようですし、修正するつもりもないのでしょう。この不具合に対処するために、情報取得する対象のページを強制的に表示するよう指示する必要があることでしょう(そんな機能はないので、GUI Scriptingで?)。

Pages書類の各ページ上の表の座標を求めると、正しい値が返らない

Posted in news | Tagged 14.0savvy 15.0savvy Pages | Leave a comment

Dock Menu

Posted on 4月 5 by Takaaki Naganoya

Dock Menuを表示するAppleScriptアプリです。探すと意外と情報がまとまっていないので、掲載しておきます。

Dock Menuについては、スクリプトエディタやスクリプトメニュー、アプレットなどで動作する通常のAppleScriptでは利用できませんが、Xcode上で作成するアプリやCocoa AppleScript Applicationでは利用できます。このあたりは、どのぐらいAppleScriptの実行環境がアプリのイベントをAppleScript側に提供しているかどうかによります。

スクリプトエディタ上で作成するアプレットの一種、Cocoa-AppleScript Appletを用いると、Dock Menuを動的に作ることが可能です(後述)。

–> Download Xcode Project Archive

AppleScript名:AppDelegate.applescript
—
— AppDelegate.applescript
— dock menu
—
— Created by Takaaki Naganoya2 on 2025/04/05.
—
—

script AppDelegate
  property parent : class "NSObject"
  
  
— IBOutlets
  
property theWindow : missing value
  
property dockMenu : missing value
  
  
on applicationWillFinishLaunching:aNotification
    
  end applicationWillFinishLaunching:
  
  
on applicationShouldTerminate:sender
    return current application’s NSTerminateNow
  end applicationShouldTerminate:
  
  
  
–Dock Menu Enabled
  
on applicationDockMenu:(aNotification)
    return dockMenu
  end applicationDockMenu:
  
  
  
on clicked:aSender
    set aTag to (tag of aSender) as integer
    
display dialog (aTag as string)
  end clicked:
end script

★Click Here to Open This Script 

Cocoa-AppleScriptアプレット版はこちらです。macOS 12以降では、Finder上でRosettaを利用して実行するように指定する必要があります。

アプレット本体側のscriptではなく、ランタイム側の「CocoaAppletAppDelegate.scpt」を書き換える必要があります。これを読み返すと、つくづく「いきなりこの内容をScripterに使わせようとしたのは無理があった」と感じます。内容が、macOS 10.7当時のScripterのCocoaへの理解度を考えると難解すぎです。

–> Download Cocoa-AppleScript Applet

AppleScript名:CocoaAppletAppDelegate.scpt
—
— CocoaAppletAppDelegate.applescript
— Cocoa-AppleScript Applet
—
— Copyright 2011 {Your Company}. All rights reserved.
—

— This application delegate emulates the OSA script applet by loading "main.scpt" from the
— "Scripts" folder in the application resources and invoking the traditional run/open/reopen/quit
— handlers in response to Cocoa application delegate methods being called.
—
— This is provided in source form so that you may customize or replace it if your needs go
— beyond the basic applet handlers.
—
— Some of these methods must guard against re-entrancy, because invoking the main.scpt
— handler may end up invoking the event handler inherited from the current application,
— which calls the application delegate’s method again.

script CocoaAppletAppDelegate
  property parent : class "NSObject"
  
property mainScript : missing value — the applet’s main.scpt
  
property didOpenFiles : false — true = the application opened documents during startup
  
property isOpeningFiles : false — re-entrancy guard: true = in the process of opening files
  
property isReopening : false — re-entrancy guard: true = in the process of re-opening
  
property isQuitting : false — re-entrancy guard: true = in the process of quitting
  
  
on applicationWillFinishLaunching:aNotification
    — Insert code here to initialize your application before any files are opened
    
    
— Emulate an OSA Applet: Load the main script from the Scripts resource folder.
    
try
      set my mainScript to load script (path to resource "main.scpt" in directory "Scripts")
    on error errMsg number errNum
      — Perhaps this should silently fail if it can’t load the script; that way, a Cocoa applet
      
— can just have Cocoa classes and no main.scpt.
      
display alert "Could not load main.scpt" message errMsg & " (" & errNum & ")" as critical
    end try
  end applicationWillFinishLaunching:
  
  
on applicationDidFinishLaunching:aNotification
    — Insert code here to do startup actions after your application has initialized
    
    
if mainScript is missing value then return
    
    
— Emulate an OSA Applet: Invoke the "run" handler.
    
    
— If we have already opened files during startup, don’t invoke the run handler.
    
if didOpenFiles then return
    
    
try
      tell mainScript to run
    on error errMsg number errNum
      if errNum is not -128 then
        display alert "An error occurred while running" message errMsg & " (" & errNum & ")" as critical
      end if
    end try
    
    
— TODO: Read the applet’s "stay open" flag and quit if it’s false or unspecified.
    
— For now, all Cocoa Applets stay open and require the run handler to explicitly quit,
    
— which is arguably more correct for a Cocoa application, anyway.
    
(* if not shouldStayOpen then
      quit
    end if *)
  end applicationDidFinishLaunching:
  
  
on applicationShouldHandleReopen:sender hasVisibleWindows:flag
    — Insert code here to perform actions in response to a "reopen" event
    
    
if mainScript is missing value then return true
    
    
— Guard against re-entrancy.
    
if not isReopening then
      set isReopening to true
      
      
— Emulate an OSA Applet: Invoke the "reopen" handler. If there isn’t one, let the application object
      
— handle reopen (this is different from an OSA applet, which would do nothing if there is no handler;
      
— this way, the application will perform the usual "create untitled document" behavior by default).
      
try
        tell mainScript to reopen
        
set isReopening to false
        
        
return false
      on error errMsg number errNum
        if errNum is not -128 then
          display alert "An error occurred while reopening" message errMsg & " (" & errNum & ")" as critical
        end if
      end try
      
      
set isReopening to false
    end if
    
    
return true
  end applicationShouldHandleReopen:hasVisibleWindows:
  
  
on |application|:sender openFiles:filenames
    — Insert code here to perform actions in response to an "open documents" event
    
    
— Remember that we opened files, to avoid invoking the "run" handler later.
    
set didOpenFiles to true
    
    
— Guard against re-entrancy.
    
if not isOpeningFiles and mainScript is not missing value then
      set isOpeningFiles to true
      
      
try
        — Convert all the filenames from NSStrings to script strings
        
set theFilenameStrings to {}
        
repeat with eachFile in filenames
          set theFilenameStrings to theFilenameStrings & (eachFile as text)
        end repeat
        
        
tell mainScript to open theFilenameStrings
        
set isOpeningFiles to false
        
        
tell sender to replyToOpenOrPrint:(current application’s NSApplicationDelegateReplySuccess)
      on error errMsg number errNum
        if errNum = -128 then
          tell sender to replyToOpenOrPrint:(current application’s NSApplicationDelegateReplyCancel)
        else
          display alert "An error occurred while opening file(s)" message errMsg & " (" & errNum & ")" as critical
          
tell sender to replyToOpenOrPrint:(current application’s NSApplicationDelegateReplyFailure)
        end if
      end try
      
      
set isOpeningFiles to false
    else
      tell sender to replyToOpenOrPrint:(current application’s NSApplicationDelegateReplyFailure)
    end if
  end |application|:openFiles:
  
  
on applicationShouldTerminate:sender
    — Insert code here to do any housekeeping before your application quits
    
    
— Guard against re-entrancy.
    
if not isQuitting and mainScript is not missing value then
      set isQuitting to true
      
      
— Emulate an OSA Applet: Invoke the "quit" handler; if the handler returns, it has fully
      
— handled the quit message and we should not quit, otherwise, it calls "continue quit",
      
— which returns error -10000.
      
try
        tell mainScript to quit
        
set isQuitting to false
        
        
return current application’s NSTerminateCancel
      on error errMsg number errNum
        — -128 means there is no quit handler
        
— -10000 means the handler did "continue quit"
        
if errNum is not -128 and errNum is not -10000 then
          display alert "An error occurred while quitting" message errMsg & " (" & errNum & ")" as critical
        end if
      end try
      
      
set isQuitting to false
    end if
    
    
return current application’s NSTerminateNow
  end applicationShouldTerminate:
  
  
  
–Dock Menu Enabled
  
on applicationDockMenu:(aNotification)
    set aMenu to current application’s NSMenu’s alloc()’s init()
    
set aMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:"Dock Menuだよ" action:"actionHandler:" keyEquivalent:"")
    (
aMenuItem’s setTarget:me)
    (
aMenu’s addItem:aMenuItem)
    
return aMenu
  end applicationDockMenu:
  
  
on actionHandler:sender
    set aTag to (tag of sender) as string
    
set aTitle to (title of sender) as string
    
    
display dialog (aTitle as string)
  end actionHandler:
end script

★Click Here to Open This Script 

Posted in AppleScript Application on Xcode Cocoa-AppleScript Applet | Tagged 13.0savvy 14.0savvy 15.0savvy | Leave a comment

Xcode 16.3で用語辞書にdebugコマンドを追加?

Posted on 4月 4 by Takaaki Naganoya

Xcode 16.3のAppleScript用語辞書を調べていたら、以前のバージョンから変更が加わっていることを見つけました。もっと前のバージョンから変更されていたのかもしれませんが (Xcode 16.2で変更されていました。16.xで変更?)、XcodeのAppleScript用語辞書は機能が壊滅状態なので、まさかアップデートされるとは思ってもみませんでした。

正直なところ、XcodeのAppleScript用語辞書は「これで何をしろと?」という出来で、よく言って「Apple社内のエンジニアが仕事をしているフリ」、正直なところ「何を実装しているのか作成者が目的を完全に見失っている」ような内容です。命令1つ2つを追加したところで、使い物になりません。XcodeのAppleScript用語辞書まわりは、完全にゼロから作り直さないと、何もできない内容です。

XcodeのAppleScript用語辞書こそ、サンプルが掲載されていないと実装側の考えがわからない内容の代表例です。作業者の知能指数を疑うレベルであり、話になりません。

まして、debugコマンドはAppleScriptで作成したアプリケーションでは使えないコマンドなので、GUI側からも使ったことがありません。

Applicationクラスがcreate temporary debugging workspaceコマンドに応答するようになった?

Xcode Application Suiteスイーツ(命令集)にcreate temporary debugging workspaceコマンドが追加された

workspace documentクラスがattachとdebugのコマンドに応答するようになった?

Xcode Scheme Suiteスイーツ(命令集)にattachとdebugコマンドが追加された

AppleScript用語辞書に掲載されているattachとdebugコマンド。本当に動くのか、どう指定するのかさっぱりわからない

Posted in Object control | Tagged 15.0savvy Xcode | Leave a comment

Post navigation

  • Older posts

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • macOS 15, Sequoia
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • Numbersで選択範囲のセルの前後の空白を削除
  • メキシカンハットの描画
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AppleScriptによる並列処理
  • macOS 15でも変化したText to Speech環境
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • デフォルトインストールされたフォント名を取得するAppleScript
  • AppleScript入門③AppleScriptを使った「自動化」とは?
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • macOS 15 リモートApple Eventsにバグ?
  • Script Debuggerの開発と販売が2025年に終了
  • AppleScript入門① AppleScriptってなんだろう?
  • macOS 14で変更になったOSバージョン取得APIの返り値
  • macOS 15:スクリプトエディタのAppleScript用語辞書を確認できない
  • NSObjectのクラス名を取得 v2.1
  • 有害ではなくなっていたSpaces
  • AVSpeechSynthesizerで読み上げテスト

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (198) 14.0savvy (152) 15.0savvy (141) CotEditor (66) Finder (51) Keynote (119) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (76) Pages (55) Pixelmator Pro (20) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • date
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • process
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC