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

タグ: Numbers

Numbersで選択範囲のdateの年を+1する

Posted on 3月 10 by Takaaki Naganoya

Numbersの書類上で選択中のセル内の日付形式データがあったら、yearを+1(インクリメント)するAppleScriptです。macOS 15.4beta+Numbers 14.3で動作確認していますが、OSバージョンおよびNumbersのバージョンに依存する部分はありません。

実行前

実行後

ものすごくつまらなくて、ものすごく用途が狭いScriptですが、実際に書いてみたら意外と手間取る感じでした。

当然、+1するだけではなくー1する機能も作ってあり、呼び出し部分を差し替えればー1するようになります。macOS標準搭載のスクリプトメニューに入れて実行することを想定しています。

AppleScript名:選択範囲のdateの年を+1する.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/03/10
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

tell application "Numbers"
  tell front document
    tell active sheet
      try
        set theTable to first table whose class of selection range is range
        
set cellList to cell of selection range of theTable
        
set valList to value of cell of selection range of theTable
        
set aLen to length of cellList
      on error
        display notification "Numbers: There is no selection"
        
return
      end try
      
      
set bValList to {}
      
repeat with i in valList
        set j to contents of i
        
set aClass to class of j
        
        
if aClass = date then
          set j to incremenetYearOf(j) of me
        end if
        
        
set the end of bValList to j
      end repeat
      
      
      
repeat with i from 1 to aLen
        set aVal to contents of item i of bValList
        
set aCell to contents of item i of cellList
        
        
ignoring application responses
          set value of aCell to aVal
        end ignoring
      end repeat
      
    end tell
  end tell
end tell

on incremenetYearOf(aDate)
  set {bYear, bMonth, bDate} to {year of aDate, month of aDate, day of aDate}
  
set bYear to bYear + 1
  
set {year of aDate, month of aDate, day of aDate} to {bYear, bMonth, bDate}
  
return aDate
end incremenetYearOf

on decremenetYearOf(aDate)
  set {bYear, bMonth, bDate} to {year of aDate, month of aDate, day of aDate}
  
set bYear to bYear – 1
  
set {year of aDate, month of aDate, day of aDate} to {bYear, bMonth, bDate}
  
return aDate
end decremenetYearOf

★Click Here to Open This Script 

Posted in Calendar list | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

Numbersで選択範囲のデータを切り捨て

Posted on 1月 20 by Takaaki Naganoya

Numbersの表の選択範囲のデータを指定の数(10,000とか、100万とか)で切り捨てるAppleScriptです。Numbers v14.3で検証してありますが、凝った機能は何も使っていないので、古いバージョンのNumbersでも問題なく動作することでしょう。

もともとは、Keynoteで作った資料でデータが細かくて見にくかったので、指定桁で切り捨て(100万円で切り捨て、など)するために作ったものです。

本来はiWorkアプリ上でこうした操作を行うには、「データフォーマット」で「カスタムフォーマット」を定義するのがiWorkの流儀です。

ただ、このカスタムフォーマットが割と遠回りでわかりにくかったので(+AppleScriptから操作できないので)、即物的にデータを編集するプログラムを作ってしまった次第です。割と、使い捨てレベルの素朴なScriptでもあります。

AppleScript名:選択範囲のデータを100万円で切り捨て.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/01/19
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

set calcNum to 10000

tell application "Numbers"
  tell front document
    tell active sheet
      tell table 1
        set aSel to cell of selection range
        
        
set newList to {}
        
repeat with i in aSel
          set j to contents of i
          
if j is not equal to missing value then
            set tmpV1 to (value of j)
            
if tmpV1 is not equal to missing value then
              set tmpV2 to tmpV1 div calcNum
              
ignoring application responses
                set value of j to tmpV2
              end ignoring
            end if
          end if
        end repeat
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in list | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

Numbersで選択中の範囲を横方向に逆順に並べて、選択範囲に再設定

Posted on 1月 14 by Takaaki Naganoya

Numbersで縦方向に行単位で任意の並べ替え(Ascending、Descending)を行うのは問題ないのですが、横方向に並べ替えをする機能がなかったので、作ってみました。


▲初期状態。左側のデータが新しく、右端が一番古いデータ。並べ替えを行う範囲を選択


▲実行後。横方向に逆順に並べ替えを行った。左端が一番古く、右端が一番新しいデータ

標準機能で欲しいところです。

データ取得は速いものの、スプレッドシートへのデータの書き込みに時間のかかるNumbers。本ScriptもApple Silicon Macで実行すればそこそこの速度で実行してくれますが、おそらくExcelに対して同様の処理を実行したら1,000倍ぐらい高速です。

それほど大量のデータを処理すると、非同期処理が途中でおかしくなるので、数千セルぐらいを上限としておいたほうがよいでしょう。

AppleScript名:Numbersで選択中の範囲を横方向に逆順に並べて、選択範囲に再設定.scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/01/14
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

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

script spd
  property aList : {}
  
property bList : {}
  
property cList : {}
end script

set (aList of spd) to get2DListFromNumbersSelection() of me
if (aList of spd) = "" then return "No Selection"

set (bList of spd) to {}

repeat with i in (aList of spd)
  set tmpList to contents of i
  
set tmpList to reverse of tmpList
  
set the end of (bList of spd) to tmpList
end repeat

set (bList of spd) to FlattenList((bList of spd)) of me

tell application "Numbers"
  tell front document
    tell active sheet
      tell table 1
        set (cList of spd) to cell of selection range
        
        
set iCount to 1
        
repeat with i in (cList of spd)
          set newVal to contents of item iCount of (bList of spd)
          
if (newVal as string) is equal to "missing value" then set newVal to ""
          
          
ignoring application responses
            set value of i to newVal
          end ignoring
          
          
set iCount to iCount + 1
        end repeat
      end tell
    end tell
  end tell
end tell

on get2DListFromNumbersSelection()
  –Numbersで選択範囲を縦に区切ったリストを返す
  
tell application "Numbers"
    tell front document
      tell active sheet
        try
          set theTable to first table whose class of selection range is range
        on error
          return "" –何も選択されてなかった場合
        end try
        
        
tell theTable
          set selList to value of every cell of selection range –選択範囲のデータを取得
          
          
set selName to name of selection range –選択範囲のrange情報を取得
          
set {s1, s2} to parseByDelim(selName, ":") of me
          
          
–始点の情報を取得する
          
set s1Row to (address of row of range s1) as integer
          
set s1Column to (address of column of range s1) as integer
          
          
–終点の情報を取得する
          
set s2Row to (address of row of range s2) as integer
          
set s2Column to (address of column of range s2) as integer
          
          
–選択範囲の情報を取得する
          
set selHeight to s2Row – s1Row + 1 –高さ(Height of selection range)
          
set selWidth to s2Column – s1Column + 1 –幅(Width of selection range)
          
        end tell
      end tell
    end tell
  end tell
  
  
set aLen to length of selList
  
set aaLen to selHeight
  
  
set bList to {}
  
repeat with i from 1 to aaLen
    set aHoriList to {}
    
    
repeat with ii from 1 to selWidth
      set j1 to ii + (i – 1) * selWidth
      
set tmpCon to contents of item j1 of selList
      
      
set aClass to class of tmpCon
      
if aClass = number or aClass = integer or aClass = real then
        set tmpCon to tmpCon as integer
      end if
      
      
set the end of aHoriList to tmpCon
    end repeat
    
    
set the end of bList to aHoriList
  end repeat
  
  
return bList
end get2DListFromNumbersSelection

–テキストを指定デリミタでリスト化
on parseByDelim(aData, aDelim)
  set aText to current application’s NSString’s stringWithString:aData
  
set aList to aText’s componentsSeparatedByString:aDelim
  
return aList as list
end parseByDelim

–By Paul Berkowitz
–2009年1月27日 2:24:08:JST
–Re: Flattening Nested Lists
on FlattenList(aList)
  set oldDelims to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {"????"}
  
set aString to aList as text
  
set aList to text items of aString
  
set AppleScript’s text item delimiters to oldDelims
  
return aList
end FlattenList

★Click Here to Open This Script 

Posted in list | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

選択範囲の値を取得して、冒頭の値の新しい数値を指定すると以下自動加算

Posted on 1月 14 by Takaaki Naganoya

Numbers上で選択範囲のデータに対して一括で数値を加算するAppleScriptです。

Numbers上で台割(PDFに対して付加するTOC用データ)を管理しているところに、実際の電子書籍の記事が増えて、各記事のノンブル(ページ番号)を変更する必要があるわけですが……これに、当初は「+18で」みたいなScriptを運用していたのですが、暗算で差分を計算していたものの、この仕様だと使いにくかったのです。

そこで、新たなページ数を入力すると、AppleSript側で差分を計算して後の選択範囲に対して加算するようにしてみました。


▲初期状態


▲PDFを参照して新版の「おくづけ」は552ページになっていることを確認 ここで、本Scriptを実行


▲差分(増分)を暗算で計算して入力するのではなく、最初のページの変更後のページ数が何か、を入力。Script側で差分を自動計算


▲実行後の状態

巨大なScriptも役立ちますが、こういう「ちょっとした」サイズのScriptもまた役に立ちます。

AppleScript名:選択範囲の値を取得して、冒頭の値の新しい数値を指定すると以下自動加算.scpt
set sNum to text returned of (display dialog "Input New First Num" default answer "")
tell application "Numbers"
  tell front document
    tell active sheet
      tell table 1
        set mySelectedRanges to value of every cell of selection range
        
set cellList to cell of selection range
        
        
set addNum to sNum – (first item of mySelectedRanges)
        
        
        
set iCount to 0
        
set newList to {}
        
repeat with i in cellList
          set tmpVal to value of i
          
set the end of newList to tmpVal + addNum
        end repeat
        
        
repeat with i from 1 to (length of cellList)
          tell item i of cellList
            set value to item i of newList
          end tell
        end repeat
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in Number | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

選択範囲のセルの数値がAscendingになっているかをチェック

Posted on 12月 26, 2024 by Takaaki Naganoya

Numbersで選択中のセルが1→2→3と、値が増加する形式(Ascending)になっているかをチェックするAppleScriptです。

書籍のページ(ノンブル)は、かならず1–>2–>3とページ数がかならず増加するようになっています。これが、途中で減るような値になっているとまずいので、そのチェックを行うようにしてみたものです。

本ScriptはNumbers v14.3でテストしていますが、もっと古いバージョンでも問題ないことでしょう。

AppleScript名:選択範囲のセルの数値がAscendingになっているかをチェック
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/12/25
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property NSString : a reference to current application’s NSString
property NSCharacterSet : a reference to current application’s NSCharacterSet

set curTable to getCurTable() of me
if curTable = "" then return

tell application "Numbers"
  tell curTable
    set cList to value of every cell of selection range
  end tell
end tell

copy cList to dList

set dList to shellSortAscending(dList) of me

if cList = dList then
  return true
else
  return false
end if

on getCurTable()
  tell application "Numbers"
    tell front document
      tell active sheet
        try
          set theTable to first table whose class of selection range is range
        on error
          return "" –何も選択されてなかった場合
        end try
        
        
return theTable
      end tell
    end tell
  end tell
end getCurTable

–入れ子ではないリストの昇順ソート
on shellSortAscending(aSortList)
  script oBj
    property list : aSortList
  end script
  
set len to count oBj’s list’s items
  
set gap to 1
  
repeat while (gap ≤ len)
    set gap to ((gap * 3) + 1)
  end repeat
  
repeat while (gap > 0)
    set gap to (gap div 3)
    
if (gap < len) then
      repeat with i from gap to (len – 1)
        set temp to oBj’s list’s item (i + 1)
        
set j to i
        
repeat while ((j ≥ gap) and (oBj’s list’s item (j – gap + 1) > temp))
          set oBj’s list’s item (j + 1) to oBj’s list’s item (j – gap + 1)
          
set j to j – gap
        end repeat
        
set oBj’s list’s item (j + 1) to temp
      end repeat
    end if
  end repeat
  
return oBj’s list
end shellSortAscending

★Click Here to Open This Script 

Posted in list | Tagged 14.0savvy 15.0savvy Numbers | Leave a comment

iWork apps 14.3にアップデート

Posted on 12月 22, 2024 by Takaaki Naganoya

Keynote、Pages、NumbersのiWork appsがバージョン14.3にアップデートしていました(気づかなかった)。

アップデート内容もたいしてありませんし、Apple Inteligenceを利用した機能なので、日本語環境では利用できません。

AppleScript用語辞書についても、とくに前バージョンから変更はありません。

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

Numbersで選択中の表を書籍掲載用にセル内容の整理(重複セルをまとめる)v2

Posted on 12月 3, 2024 by Takaaki Naganoya

Numbersの表を、書籍掲載用に体裁をととのえるAppleScriptのアップデート版です。書籍掲載時には、同じ値が横方向に連続している箇所は1つにまとめたいところなので、その作業を自動で行います。

新型のNumbers/Excelセルアドレス変換ルーチンを実際に使用してみました。モジュールを入れ替えただけです。


▲対象の表のいずれかのセルを選択してAppleScriptを実行


▲処理後の表

AppleScript名:Numbersで選択中の表を書籍掲載用にセル内容の整理(重複セルをまとめる)v2.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/12/03
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—

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

tell application "Numbers"
  tell front document
    tell active sheet
      try
        set theTable to first table whose class of selection range is range
      on error
        return "" –何も選択されてなかった場合
      end try
      
      
      
–セルを選択中の表を処理する
      
tell theTable
        set headR to header row count
        
set headC to header column count
        
set rowC to count every row
        
set colC to count every column
        
        
repeat with y from (headR + 1) to (rowC)
          –1行分(ヘッダーカラムをのぞく)のデータを1D Listで取得
          
set tmpRangeStr to numberToCell(headC + 1) of AddressEncoder & (y as string) & ":" & numberToCell(colC) of AddressEncoder & (y as string)
          
set tValList to value of cells of range tmpRangeStr
          
          
–1D Listから値が連続している区間を求める
          
set sameBlock to detectSameValueRepeatationBlockIn1DArray(tValList) of detectRepeatation
          
          
–連続区間でループ
          
repeat with i in sameBlock
            copy i to {startX, endX} –データ内の項目Indexであることに留意
            
            
–重複値のセルをクリアする(初出セルの値は残す)
            
repeat with ii from (startX + 1) to endX
              set value of cell (ii + headC) of row y to ""
            end repeat
            
            
–重複していたセルをマージする
            
set mRangeStr to numberToCell(headC + startX) of AddressEncoder & (y as string) & ":" & numberToCell(headC + endX) of AddressEncoder & (y as string)
            
set mRange to range mRangeStr
            
merge mRange
          end repeat
        end repeat
      end tell
    end tell
  end tell
end tell

script detectRepeatation
  property parent : AppleScript
  
use scripting additions
  
use framework "Foundation"
  
  
–巨大なデータの処理に向いていないかも?
  
on detectSameValueRepeatationBlockIn1DArray(aList)
    set dList to returnDuplicatesOnly(aList) of me
    
–>  {​​​​​"年間仕様", ​​​​​"YP仕様", ​​​​​"月間仕様"​​​}
    
    
set anArray to current application’s NSMutableArray’s arrayWithArray:aList
    
anArray’s addObject:""
    
    
set resList to {}
    
repeat with i in dList
      set j to contents of i
      
set anIndex to (anArray’s indexOfObject:j)
      
repeat with ii from (anIndex + 1) to ((length of aList))
        set jj to (anArray’s objectAtIndex:ii) as string
        
if jj is not equal to j then
          set the end of resList to {anIndex + 1, ii}
          
exit repeat
        end if
      end repeat
    end repeat
    
    
resList
    
–>  {​​​​​{​​​​​​​4, ​​​​​​​6​​​​​}, ​​​​​{​​​​​​​7, ​​​​​​​9​​​​​}, ​​​​​{​​​​​​​10, ​​​​​​​17​​​​​}​​​}
  end detectSameValueRepeatationBlockIn1DArray
  
  
on returnDuplicatesOnly(aList)
    set countedSet to current application’s NSCountedSet’s alloc()’s initWithArray:aList
    
set simpleSet to current application’s NSSet’s setWithArray:aList
    
countedSet’s minusSet:simpleSet
    
return countedSet’s allObjects() as list
  end returnDuplicatesOnly
end script

script AddressEncoder
  property parent : AppleScript
  
use scripting additions
  
  
— 数値からセルアドレス(A1形式)への変換
  
on numberToCell(columnNumber)
    set columnAddress to ""
    
set tempNumber to columnNumber
    
    
— 列番号をA-Z形式に変換
    
repeat while tempNumber > 0
      set remainder to (tempNumber – 1) mod 26
      
set columnAddress to (character (remainder + 1) of "ABCDEFGHIJKLMNOPQRSTUVWXYZ") & columnAddress
      
set tempNumber to (tempNumber – 1) div 26
    end repeat
    
    
— A1形式のアドレスを返す
    
return columnAddress
  end numberToCell
  
  
  
— セルアドレス(A1形式)から数値への変換
  
on cellToNumber(cellAddress)
    set columnPart to ""
    
set rowPart to ""
    
    
— 列部分と行部分を分離
    
repeat with char in cellAddress
      if char is in "0123456789" then
        set rowPart to rowPart & char
      else
        set columnPart to columnPart & char
      end if
    end repeat
    
    
— 列部分を数値に変換
    
set columnNumber to 0
    
repeat with i from 1 to length of columnPart
      set char to character i of columnPart
      
using terms from scripting additions
        set columnNumber to columnNumber * 26 + (offset of char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
      end using terms from
    end repeat
    
    
— 数値を返す
    
return {columnNumber, (rowPart as integer)}
  end cellToNumber
  
end script

★Click Here to Open This Script 

Posted in list Object control | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

Excel__Numbersセルアドレスの相互変換

Posted on 12月 3, 2024 by Takaaki Naganoya

ExcelやNumbersで使われているセルのアドレス表記方法「A1形式」と数値の相互変換を行うAppleScriptです。

一応、自分でも昔に書いたルーチンを使い回していますが、26進数と10進数との間の変換で桁が増えたときの処理に難があって、上限値を設けてその間であれば変換できる、という感じになっていました。

もともと、このルーチンはExcel 2008でVBAの処理系を搭載しないことになったのを好機ととらえ、AppleScriptをエンコードしてExcelの隠しワークシート上に格納しておいて外部から実行する「ExcelAS」プロジェクトのために作成したものです。

実際に調布のMicrosoftでデモを行なって、US Microsoftに掛け合ってもらったものの、次バージョンでVBAの処理系を復活させることになって、(Visual BASIC互換の)「REALbasic」のエンジンを書いていたエンジニアをMSがヘッドハント。常識的に考えればVBAの廃止自体がおかしな決定だったので、その隙を狙えるかも? と企画して作ったものの、残念な結果になってしまいました。ただ、現在に至るもMac上のVBAの処理系、とくにエディタは作りが残念(Retina解像度に合ってないとか、日本語入力できないとか、フォームが使えないとか)なので、もうちょっとなんとかならないものかと思ってしまいます。

話をアドレス変換ルーチンに戻しましょう。実際に、そんなに大きな値の相互変換はしていないので問題視していませんでしたが、変換ルーチンに上限値のしばりがあるのはうっとおしいとは思っていました。ただ、ExcelASプロジェクトの頓挫により、アドレス変換処理を書き換えるほどのインセンティブがなかったので、ながらく放置状態に。

そこで、定期的に行なっているChatGPTによるAppleScript記述実用性チェックの「お題」としてこのセルアドレスの相互変換を行わせてみました。

ちゃんと動いているように見えます。こういうデータ変換系のプログラムは、割とChatGPTで書かせるのは「アリ」だと思います。本ルーチンの注意点は、Excelアドレス(カラム名指定)はアルファベット大文字で記述する必要があるということです。小文字のアルファベットで記述すると本バージョンではエラーになります。

ただ、アプリケーションの詳細なコントロールを行わせると、首をひねってしまうような書き方を返してきます。

AppleScript名:Excel__Numbersセルアドレスの相互変換.scpt
— 数値 → A1形式
set result1 to numberToCell(2024, 5) — "BYV5"
display dialog "Number to Cell: " & result1

— A1形式 → 数値
set result2 to cellToNumber("BYV5") — {2024, 5}
display dialog "Cell to Number: Column: " & item 1 of result2 & ", Row: " & item 2 of result2

— 数値からセルアドレス(A1形式)への変換
on numberToCell(columnNumber, rowNumber)
  set columnAddress to ""
  
set tempNumber to columnNumber
  
  
— 列番号をA-Z形式に変換
  
repeat while tempNumber > 0
    set remainder to (tempNumber – 1) mod 26
    
set columnAddress to (character (remainder + 1) of "ABCDEFGHIJKLMNOPQRSTUVWXYZ") & columnAddress
    
set tempNumber to (tempNumber – 1) div 26
  end repeat
  
  
— A1形式のアドレスを返す
  
return columnAddress & rowNumber
end numberToCell

— セルアドレス(A1形式)から数値への変換
on cellToNumber(cellAddress)
  set columnPart to ""
  
set rowPart to ""
  
  
— 列部分と行部分を分離
  
repeat with char in cellAddress
    if char is in "0123456789" then
      set rowPart to rowPart & char
    else
      set columnPart to columnPart & char
    end if
  end repeat
  
  
— 列部分を数値に変換
  
set columnNumber to 0
  
repeat with i from 1 to length of columnPart
    set char to character i of columnPart
    
set columnNumber to columnNumber * 26 + (offset of char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  end repeat
  
  
— 数値を返す
  
return {columnNumber, (rowPart as integer)}
end cellToNumber

★Click Here to Open This Script 

Posted in Number Text | Tagged 10.10savvy 10.11savvy 10.12savvy 10.13savvy 10.14savvy 10.15savvy 11.0savvy 12.0savvy 13.0savvy 14.0savvy 15.0savvy Excel Numbers | Leave a comment

Numbersで選択中の表を書籍掲載用にセル内容の整理(重複セルをまとめる)

Posted on 12月 2, 2024 by Takaaki Naganoya

Numbersの表を、書籍掲載用に体裁をととのえるAppleScriptです。書籍掲載時には、同じ値が横方向に連続している箇所は1つにまとめたいところなので、その作業を自動で行います。


▲こんな感じに掲載している表を作るためのScript

いずれかのセルを選択した表に対して処理を行います。表の各行のデータを取得し、データ連続区間を検出。連続区間の2つ目以降のセルの内容を消去したうえで、当該区間のセルをまとめます。

そんなに大きな表を処理するようにはできていません。色をつけるところまで自動化しようかとも考えたのですが、色についてはケースバイケースだろうと考え、そこまでは処理していません。


▲対象の表のいずれかのセルを選択してAppleScriptを実行


▲処理後の表

AppleScript名:Numbersで選択中の表を書籍掲載用にセル内容の整理(重複セルをまとめる).scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/12/02
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—

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

tell application "Numbers"
  tell front document
    tell active sheet
      try
        set theTable to first table whose class of selection range is range
      on error
        return "" –何も選択されてなかった場合
      end try
      
      
      
–セルを選択中の表を処理する
      
tell theTable
        set headR to header row count
        
set headC to header column count
        
set rowC to count every row
        
set colC to count every column
        
        
repeat with y from (headR + 1) to (rowC)
          –1行分(ヘッダーカラムをのぞく)のデータを1D Listで取得
          
set tmpRangeStr to numAdrToColumnEncode(headC + 1) of AddressEncoder & (y as string) & ":" & numAdrToColumnEncode(colC) of AddressEncoder & (y as string)
          
set tValList to value of cells of range tmpRangeStr
          
          
–1D Listから値が連続している区間を求める
          
set sameBlock to detectSameValueRepeatationBlockIn1DArray(tValList) of detectRepeatation
          
          
–連続区間でループ
          
repeat with i in sameBlock
            copy i to {startX, endX} –データ内の項目Indexであることに留意
            
            
–重複値のセルをクリアする(初出セルの値は残す)
            
repeat with ii from (startX + 1) to endX
              set value of cell (ii + headC) of row y to ""
            end repeat
            
            
–重複していたセルをマージする
            
set mRangeStr to numAdrToColumnEncode(headC + startX) of AddressEncoder & (y as string) & ":" & numAdrToColumnEncode(headC + endX) of AddressEncoder & (y as string)
            
set mRange to range mRangeStr
            
merge mRange
          end repeat
        end repeat
      end tell
    end tell
  end tell
end tell

script detectRepeatation
  property parent : AppleScript
  
use scripting additions
  
use framework "Foundation"
  
  
–巨大なデータの処理に向いていないかも?
  
on detectSameValueRepeatationBlockIn1DArray(aList)
    set dList to returnDuplicatesOnly(aList) of me
    
–>  {​​​​​"年間仕様", ​​​​​"YP仕様", ​​​​​"月間仕様"​​​}
    
    
set anArray to current application’s NSMutableArray’s arrayWithArray:aList
    
anArray’s addObject:""
    
    
set resList to {}
    
repeat with i in dList
      set j to contents of i
      
set anIndex to (anArray’s indexOfObject:j)
      
repeat with ii from (anIndex + 1) to ((length of aList))
        set jj to (anArray’s objectAtIndex:ii) as string
        
if jj is not equal to j then
          set the end of resList to {anIndex + 1, ii}
          
exit repeat
        end if
      end repeat
    end repeat
    
    
resList
    
–>  {​​​​​{​​​​​​​4, ​​​​​​​6​​​​​}, ​​​​​{​​​​​​​7, ​​​​​​​9​​​​​}, ​​​​​{​​​​​​​10, ​​​​​​​17​​​​​}​​​}
  end detectSameValueRepeatationBlockIn1DArray
  
  
on returnDuplicatesOnly(aList)
    set countedSet to current application’s NSCountedSet’s alloc()’s initWithArray:aList
    
set simpleSet to current application’s NSSet’s setWithArray:aList
    
countedSet’s minusSet:simpleSet
    
return countedSet’s allObjects() as list
  end returnDuplicatesOnly
end script

script AddressEncoder
  property parent : AppleScript
  
  
–10進数数値をExcel 2004/2008的カラム表現にエンコードするサブルーチン(エンコード範囲:1~1351)
  
on numAdrToColumnEncode(origNum)
    if origNum > 1351 then
      error "エラー:Numbersのカラム表現(A1形式)への変換ルーチンにおいて、想定範囲外(1351以上)のパラメータが指定されました"
    end if
    
    
set upperDigitEncTable to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A"}
    
set lowerDigitEncTable to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A"}
    
    
set oNum to origNum
    
set nTh to 26
    
set stringLength to 4
    
    
–数字が1桁の場合の対応
    
if origNum < 27 then
      set aRes to (item origNum of upperDigitEncTable) as string
      
return aRes
    end if
    
    
if origNum > 702 then
      –3桁になる場合
      
set upupNum to oNum div 676 –整数除算–上の上の桁
      
set oNum to oNum – (upupNum * 676)
      
set upNum to oNum div 26 –整数除算–上の桁
      
set lowNum to oNum mod 26 – 1 –余剰計算–下の桁
      
      
–つじつま合わせ処理 【強引】
      
if lowNum = -1 then
        set upNum to upNum – 1
        
set lowNum to 25
      end if
      
      
set upupChar to (item upupNum of upperDigitEncTable) as string
      
set upChar to (item upNum of upperDigitEncTable) as string
      
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
      
set resText to upupChar & upChar & lowChar
      
    else
      –2桁の場合
      
set upNum to oNum div 26 –整数除算–上の桁
      
set lowNum to oNum mod 26 – 1 –余剰計算–下の桁
      
      
–つじつま合わせ処理 【強引】
      
if lowNum = -1 then
        set upNum to upNum – 1
        
set lowNum to 25
      end if
      
      
set upChar to (item upNum of upperDigitEncTable) as string
      
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
      
set resText to upChar & lowChar
      
    end if
    
    
return resText
  end numAdrToColumnEncode
  
  
–Numbersの横方向アドレス(A~Zの26進数)文字列を10進数に変換
  
on colAddrToNumDecode(origStr)
    return aNthToDecimal(origStr, {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}) of me
  end colAddrToNumDecode
  
  
  
–n進数文字列を10進数に変換する
  
on aNthToDecimal(origStr, nTh)
    set resNumber to 0
    
    
set sList to reverse of (characters of origStr)
    
set aLen to length of nTh
    
set digitCount to 0
    
    
repeat with i in sList
      set j to contents of i
      
set aRes to offsetInList(j, nTh) of me
      
      
set resNumber to resNumber + (aLen ^ digitCount) * aRes
      
      
set digitCount to digitCount + 1
    end repeat
    
    
return resNumber as integer
  end aNthToDecimal
  
  
  
on offsetInList(aChar, aList)
    set anArray to NSArray’s arrayWithArray:aList
    
set aInd to (anArray’s indexOfObject:aChar)
    
if aInd = current application’s NSNotFound or (aInd as number) > 9.99999999E+8 then
      error "Invalid Character Error"
    else
      return (aInd as integer) + 1 –0 to 1 based index conversion
    end if
  end offsetInList
  
end script

★Click Here to Open This Script 

Posted in list Object control | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

Numbers+ignoring application responsesの注意点

Posted on 11月 21, 2024 by Takaaki Naganoya

Numbersは、表からのデータ取得は高速なのに表にデータを設定するのが1000倍以上遅いという特徴を持っています。Numbersの表にデータを連続設定するのが、ある意味現行環境で一番重いAppleScriptのベンチマークと言われてしまうほどに。

そんな中、「ignoring application responses」句で囲って、非同期コマンド実行を行うと、Numbersでも100倍ぐらいの高速化が図れます。AppleScriptの処理系はすぐに解放されますが、Numbers側でコマンドをバッファリングして処理を継続します。

速くなりすぎなので、どこかに副作用があるのでは? と、かなり懐疑的な目で見ていましたが、どうやら危ないポイントが見えてきました。

5×5000セルを連続値で埋める、というテストを「ignoring application responses」つきで行なっていたところ、2万2000を超えたあたりでNumbersの表にデータが書き込まれなくなっていました。


▲10x 5,000のセルを選択して、連続値で埋める処理を非同期モードで実行した結果。この処理では、31,717まで実行したところで終わった

AppleEventのコマンドのバッファリングをアプリ側で行なっているような挙動だったのですが、このバッファに一定の上限があるという仮説を立てています。

ちょっとした処理を行うだけではこの「上限」に達することはないものと思われますが、Numbersに対してセルに値を連続かつ大量に設定するような場合には気をつけてください。

実施環境は、Numbers v14.2+macOS 15.2beta+MacBook Air M2(RAM 16GB)です。

ちなみに、同一環境でMicrosoft Excelで選択範囲(10×5,000)のデータ取得+書き換え+書き戻しをAppleScriptで行なってみたら、1.1秒で終わりました。データの取りこぼしは一切ありません。

AppleScript名:選択中のセルをシーケンシャル値で埋める(ベンチマーク用).scpt
use AppleScript
use scripting additions
use framework "Foundation"

script spd
  property aList : {}
end script

set a1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()

set sNum to 1
tell application "Numbers"
  tell front document
    tell active sheet
      tell table 1
        set (aList of spd) to cell of selection range
        
        
set iCount to 0
        
set newList to {}
        
repeat with i in (aList of spd)
          set the end of newList to sNum + iCount
          
          
ignoring application responses
            set value of i to sNum
          end ignoring
          
          
set sNum to sNum + 1
        end repeat
      end tell
    end tell
  end tell
end tell

set b1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate()
set c1Dat to (b1Dat – a1Dat)

★Click Here to Open This Script 

Posted in How To | Tagged ignoring application responses Numbers | Leave a comment

新刊電子書籍「AppleScript基礎テクニック(33)選択中のオブジェクト取得」を刊行

Posted on 11月 21, 2024 by Takaaki Naganoya

新刊電子書籍「AppleScript基礎テクニック(33)複数のアプリをコントロール」を刊行しました。全74ページ、サンプルAppleScriptアーカイブつき。
→ 販売ページ

macOS上のGUIアプリの書類やウィンドウ中で選択中のオブジェクトを取得し、その情報をもとにAppleScriptで処理を行なって、もとの選択オブジェクトに反映させるといった処理を、日常的に行っています。

このような書き方ができると、まるでAppleScriptによってGUIアプリの機能を拡張しているようにも見えます。実際には外部で処理を行なっていたとしても、使い勝手としては拡張しているように振る舞えます。

ある意味、AppleScriptの備える最強の機能といってもよいでしょう。本書で、この強力なselection機能について、その概要から実例、注意点にいたるまで幅広くご紹介いたします。

PDF 74ページ、Zipアーカイブ添付

目次

■最初に:macOS 13以降では最初にステージマネージャを必ずオフにしてください

macOS 13.x
macOS 14.x
macOS 15.x
その他、オフにすることが望ましい機能

■アプリ上の選択中のオブジェクトにアクセスする予約語「selection」

GUIアプリ上の選択中のオブジェクトを知る
選択中のオブジェクトは、1つだけじゃない
選択中のオブジェクトを加工することも
選択中のオブジェクトの情報分析

■選択中のオブジェクトの情報をもとに他のアプリで処理

selection系の機能をサポートしているアプリ一覧
selectを含む予約語を持つアプリと予約語①
selectを含む予約語を持つアプリと予約語②
selectを含む予約語を持つアプリと予約語③

■selectionの主な実例

selectionの取得方法①(Finder)
selectionの取得方法②(Finder)
selectionの書き換え①(Finder)
selectionの書き換え②(Finder)
selectionの取得方法③(Finder)

selectionの取得方法(住所録)
selectionの書き換え(住所録)
selectionの書き換え(住所録)

selectionの取得方法①(Keynote)
selectionの取得方法②(Keynote)
selectionの書き換え(Keynote)

selectionの取得方法①(ミュージック)
selectionの取得方法②(ミュージック)
selectionの書き換え(ミュージック)

selectionの取得方法①(CotEditor)
selectionの取得方法②(CotEditor)
selectionの書き換え(CotEditor)

selectionの取得方法①(Numbers)
selectionの取得方法②(Numbers)
active sheetの取得方法(Numbers)
selection rangeの取得方法①(Numbers)
selection rangeの取得方法②(Numbers)
selection rangeのセル内容書き換え①(Numbers)
selection rangeのセル内容書き換え②(Numbers)
selection rangeのセル内容書き換え③(Numbers)

selectionの取得方法①(Excel)
selectionの取得方法②(Excel)
選択中のワークシートの取得方法(Excel)
selectionの書き換え(Excel)

selectionの取得方法(Pixelmator Pro)
select-を含む予約語解説①(Pixelmator Pro)
select-を含む予約語解説②(Pixelmator Pro)
select-を含むコマンド実例①(Pixelmator Pro)
select-を含むコマンド実例②(Pixelmator Pro)
select-を含むコマンド実例③(Pixelmator Pro)
select-を含むコマンド実例④(Pixelmator Pro)
select-を含むコマンド実例⑤(Pixelmator Pro)
select-を含むコマンド実例⑥(Pixelmator Pro)
select-を含むコマンド実例⑦(Pixelmator Pro)
select-を含むコマンド実例⑧(Pixelmator Pro)
select-を含むコマンド実例⑨(Pixelmator Pro)
select-を含むコマンド実例⑩(Pixelmator Pro)
select-を含むコマンド実例⑪(Pixelmator Pro)

■selectionを使用うえで注意すべき点

注意点1:大量のオブジェクトの受け渡しに要注意
注意点2:情報の書き戻し時には時間がかかる例も
注意点3:選択オブジェクトの種別判定を①
注意点3:選択オブジェクトの種別判定を②

Posted in Books news | Tagged 13.0savvy 14.0savvy 15.0savvy Contacts CotEditor Excel Finder Keynote Music Numbers Pixelmator Pro | Leave a comment

Numbersの選択範囲で空欄でないセルに指定の文字を入れる

Posted on 10月 17, 2024 by Takaaki Naganoya

Numbersの表を書き換えるためのAppleScriptです。表の選択範囲のうち、空欄でないセルに指定の文字(「●」)を入れます。

電子書籍掲載の「表」を作るのに、割と必要なものです。

「表」をまとめる段階では、

のように、生データをそのままセルに記載しておきますが、場所の利用効率でいえばそのまま生データで掲載していると無駄があります。

そこで、空欄ではないセルについては、「●」などの記号を記入することで、コンパクトな「表」に作り変える作業が発生します。本AppleScriptはそれを自動化したものです。

AppleScript名:選択範囲で空欄でないセルに指定の文字を入れる.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/10/17
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—

script spd
  property uniqList : {}
end script

set strMark to "●"

tell application "Numbers"
  tell front document
    tell active sheet
      try
        set theTable to first table whose class of selection range is range
      on error
        display notification "Numbers: There is no selection"
        
return
      end try
      
      
tell theTable
        set (uniqList of spd) to cells of selection range
        
repeat with i in (uniqList of spd)
          set j to contents of i
          
set tmpVal to value of j
          
if tmpVal is not equal to missing value then
            set value of j to strMark
          end if
        end repeat
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

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

Numbersで選択中の2列のセルを比較して並べ直して書き戻す v2

Posted on 10月 14, 2024 by Takaaki Naganoya

Numbers上でデータを整理しているときに、必要になって組んでみたものです。少し大きいAppleScriptですが、ありもののルーチンをつなぎ合わせて書いたので、とくに画期的な何かを書いたということはありません。

もともと、Numbers上にまとめたデータ(2列分)があって、それらを同じものは同じ行に並べ、削除されたものは空欄、追加されたものは下に列挙するという整理を行なっていました。


▲処理前の状態。2列x処理を行う分の行を選択した状態で本AppleScriptを実行する(スクリプトメニューなどを推奨)


▲処理後の状態。このように整理を行う

この作業をまとめて行うものです。そんなに高速化に配慮しているわけではないので、巨大なデータを扱うのには(このままでは)向いていないかもしれません。ただ、高速化の余地はいろいろあります。

もう、これは分かりきっていた話ですが、Numbers向けに凝ったAppleScriptを書くと、Numbersの機能はほとんど使わずに、AppleScriptの配列やらNSObjectのNSArrayやらを使いまくった「Cocoaの機能のオンパレード」みたいなAppleScriptになります。これは、Numbersに絶望的に何も機能がないためで、データの入出力しか行う余地がありません。

AppleScript名:選択中の2列のセルを比較して並べ直して書き戻す v2
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/10/14
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set curTable to getCurTable() of me
if curTable = "" then return

set {s1Row, s1Column, e1Row, e1Column} to getSelectionRange(curTable) of me
–> {73, 3, 86, 4}

set colWidth to e1Column – s1Column + 1
–> 2

if colWidth is not equal to 2 then
  display dialog "Numbers上の表の選択幅が2ではないので、処理終了します" buttons {"OK"} default button 1
  
return
end if

set rowHeight to e1Row – s1Row + 1
–> 15

–縦方向に列のセルの値を取得(左側)
set v1List to getValueByRange(curTable, s1Column, s1Row, e1Row) of me

–スイープ(空白セルのmissing valueを除去)
set v1aList to sweepList(v1List, missing value) of me
–> {"com.apple.eloquence.fr-CA.Grandpa", "com.apple.eloquence.fi-FI.Grandpa", " com.apple.eloquence.de-DE.Grandpa", " com.apple.eloquence.pt-BR.Grandpa", "com.apple.eloquence.en-US.Grandpa", "com.apple.eloquence.es-ES.Grandpa", " com.apple.eloquence.en-GB.Grandpa", " com.apple.eloquence.it-IT.Grandpa", " com.apple.eloquence.es-MX.Grandpa"}

–縦方向に列のセルの値を取得(右側)
set v2List to getValueByRange(curTable, e1Column, s1Row, e1Row) of me

–スイープ(空白セルのmissing valueを除去)
set v2aList to sweepList(v2List, missing value) of me
–> {"com.apple.eloquence.de-DE.Grandpa", "com.apple.eloquence.en-GB.Grandpa", "com.apple.eloquence.en-US.Grandpa", "com.apple.eloquence.es-ES.Grandpa", "com.apple.eloquence.es-MX.Grandpa", "com.apple.eloquence.fi-FI.Grandpa", "com.apple.eloquence.fr-CA.Grandpa", "com.apple.eloquence.fr-FR.Grandpa", "com.apple.eloquence.it-IT.Grandpa", "com.apple.eloquence.pt-BR.Grandpa", "com.apple.eloquence.ja-JP.Grandpa", "com.apple.eloquence.ko-KR.Grandpa", "com.apple.eloquence.zh-CN.Grandpa", "com.apple.eloquence.zh-TW.Grandpa"}

set dList to getDiffBetweenLists(v1aList, v2aList) of me
–> {addItems:{"com.apple.eloquence.zh-TW.Grandpa", "com.apple.eloquence.ko-KR.Grandpa", "com.apple.eloquence.ja-JP.Grandpa", "com.apple.eloquence.zh-CN.Grandpa"}, minusItems:{}}

set newList to {}
set minusList to minusItems of dList

repeat with i in v1aList
  set j to contents of i
  
if j is not in minusList then
    if j is in v2aList then
      set the end of newList to j
    else
      set the end of newList to ""
    end if
  else
    set the end of newList to ""
  end if
end repeat

set addList to addItems of dList
set addList to sort1DNumList(addList, true) of me –昇順ソート

set new2List to newList & addList

set newLen to length of new2List
if newLen > rowHeight then
  display dialog "新規データが大きいため(" & (rowHeight as string) & "行に対して、データが" & (newLen as string) & "件)データをNumbersに描き戻せません"
  
return –元のデータ範囲よりも、新規データ範囲(行)が多かったら処理を打ち切る(将来アップデート予定。行挿入などで対処)
end if

repeat (rowHeight – newLen + 1) times
  set the end of new2List to ""
end repeat

setValueByRange(curTable, e1Column, s1Row, e1Row, new2List) of me

on setValueByRange(curTable, s1Column, s1Row, e1Row, vList)
  tell application "Numbers"
    tell curTable
      tell column s1Column
        set cList to cells s1Row thru e1Row
      end tell
      
      
set aCount to 1
      
repeat with i in cList
        set aVal to item aCount of vList
        
set value of i to aVal
        
set aCount to aCount + 1
      end repeat
      
    end tell
  end tell
end setValueByRange

on getValueByRange(curTable, s1Column, s1Row, e1Row)
  tell application "Numbers"
    tell curTable
      tell column s1Column
        set vList to value of cells s1Row thru e1Row
        
return vList
      end tell
    end tell
  end tell
end getValueByRange

on getCurTable()
  tell application "Numbers"
    tell front document
      tell active sheet
        try
          set theTable to first table whose class of selection range is range
        on error
          return "" –何も選択されてなかった場合
        end try
        
        
return theTable
      end tell
    end tell
  end tell
end getCurTable

on getSelectionRange(theTable)
  tell application "Numbers"
    tell theTable
      set aSel to properties of selection range
      
set selName to name of aSel
      
set {s1, s2} to parseByDelim(selName, ":") of me
      
      
–始点の情報を取得する
      
set s1Row to (address of row of range s1) as integer
      
set s1Column to (address of column of range s1) as integer
      
      
–終点の情報を取得する
      
set e1Row to (address of row of range s2) as integer
      
set e1Column to (address of column of range s2) as integer
      
      
return {s1Row, s1Column, e1Row, e1Column}
    end tell
  end tell
end getSelectionRange

on parseByDelim(aData, aDelim)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set dList to text items of aData
  
set AppleScript’s text item delimiters to curDelim
  
return dList
end parseByDelim

on sweepList(aList, sweepItem)
  set bList to {}
  
repeat with i in aList
    if contents of i is not equal to sweepItem then
      set the end of bList to contents of i
    end if
  end repeat
  
return bList
end sweepList

–リストの差分を取得_v2
on getDiffBetweenLists(aArray as list, bArray as list)
  set allSet to current application’s NSMutableSet’s setWithArray:aArray
  
allSet’s addObjectsFromArray:bArray
  
  
–重複する要素のみ抜き出す
  
set duplicateSet to current application’s NSMutableSet’s setWithArray:aArray
  
duplicateSet’s intersectSet:(current application’s NSSet’s setWithArray:bArray)
  
  
–重複部分を削除する
  
allSet’s minusSet:duplicateSet
  
set resArray to (allSet’s allObjects()) as list
  
  
set aSet to current application’s NSMutableSet’s setWithArray:aArray
  
set bSet to current application’s NSMutableSet’s setWithArray:resArray
  
aSet’s intersectSet:bSet –積集合
  
set addRes to aSet’s allObjects() as list
  
  
set cSet to current application’s NSMutableSet’s setWithArray:bArray
  
cSet’s intersectSet:bSet –積集合
  
set minusRes to cSet’s allObjects() as list
  
  
return {addItems:minusRes, minusItems:addRes}
end getDiffBetweenLists

–1D List(数値)をsort / ascOrderがtrueだと昇順ソート、falseだと降順ソート
on sort1DNumList(theList as list, aBool as boolean)
  tell current application’s NSSet to set theSet to setWithArray_(theList)
  
tell current application’s NSSortDescriptor to set theDescriptor to sortDescriptorWithKey_ascending_(missing value, aBool)
  
set sortedList to theSet’s sortedArrayUsingDescriptors:{theDescriptor}
  
return (sortedList) as list
end sort1DNumList

★Click Here to Open This Script 

Posted in diff list | Tagged 13.0savvy 14.0savvy 15.0savvy Numbers | Leave a comment

Numbersで選択範囲のセルの前後の空白を削除

Posted on 10月 14, 2024 by Takaaki Naganoya

コピペで作ったNumbersの表に空白文字(ゴミ)が入っている場合のクリーニング用AppleScriptです。Numbers v14.2用に作成しましたが、バージョンが異なっても動作に変化はないでしょう。

ExcelやNumbersなどの表計算アプリでは、前のセルに入力されたフォーマットを維持する機能がついているため、前のセルが空白文字ではじまる(=ゴミが入っている)と、次のセルにも同様にゴミが入ることになります。

そこで、クリーニング用に本Scriptを作成しました。


▲こんな風に、セルの先頭にスペースが入ってしまっている場合のクリーニング用Script。対象セルを選択して本Scriptを実行


▲本Script実行後の様子。各セルの冒頭に入っていたスペースが削除される

ただ、大量のセルを処理するような配慮は一切行っていないので、広範囲のセルを処理する場合には、もっと真剣に高速化を行う必要があることでしょう。

macOS標準装備のスクリプトメニューに入れて呼び出すことを想定しています。

AppleScript名:選択範囲のセルの前後の空白を削除して書き戻す
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/10/14
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property NSString : a reference to current application’s NSString
property NSCharacterSet : a reference to current application’s NSCharacterSet

set curTable to getCurTable() of me
if curTable = "" then return

tell application "Numbers"
  tell curTable
    set cList to every cell of selection range
    
repeat with i in cList
      set j to contents of i
      
set tmpVal to value of j
      
if tmpVal is not equal to missing value then
        set tmpVal to trimWhiteSpaceFromHeadAndTail(tmpVal) of me
        
ignoring application responses
          set value of j to tmpVal
        end ignoring
      end if
    end repeat
  end tell
end tell

on getCurTable()
  tell application "Numbers"
    tell front document
      tell active sheet
        try
          set theTable to first table whose class of selection range is range
        on error
          return "" –何も選択されてなかった場合
        end try
        
        
return theTable
      end tell
    end tell
  end tell
end getCurTable

on trimWhiteSpaceFromHeadAndTail(aStr as string)
  set aString to NSString’s stringWithString:aStr
  
set bString to aString’s stringByTrimmingCharactersInSet:(NSCharacterSet’s whitespaceAndNewlineCharacterSet)
  
return bString as anything –as anything
end trimWhiteSpaceFromHeadAndTail

★Click Here to Open This Script 

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

iWork Appsがv14.2にアップデート

Posted on 9月 20, 2024 by Takaaki Naganoya

iWork Apps(Keynote、Pages、Numbers)がバージョン14.2にアップデートしました。

すべてのアプリでAppleScript用語辞書への変更はありません。

Keynote 14.2では、macOS 15, Sequoia上でHDRコンテンツの表示をサポートしています。

バグの修正がうたわれていますが、Pagesのページ上のオブジェクトの情報を取得できる範囲が現在表示中の見開き+6ページに制限されるというアホな仕様は変わっていないことを確認しています。

Posted in news | Tagged Keynote Numbers Pages | Leave a comment

iWork Appsでオブジェクトの削除を安全に

Posted on 9月 14, 2024 by Takaaki Naganoya

iWork Apps(Keynote、Pages、Numbers)にはAppleScript系の機能でいろいろ勘弁してほしい仕様がありますが、その中でも最大のものが、書類内の各オブジェクトがIndexで管理されていることです。

Indexというのは、1からはじまる連番の数値です。

iWork Apps(Keynote、Pages、Numbers)のドキュメント上でオブジェクトの削除を行おうとすると、「地獄」を見ることになります。

iWork Appsの書類上でオブジェクトの削除を行うと、このIndex値が振り直されてしまうために、正しく「対象」を指し示すことが(途中から)できなくなってしまうのです。あるいは、まったく関係のない別のオブジェクトが削除されるとか。

これが、idで管理されていれば、何かのオブジェクトを削除されても影響はありません。何かUUID的な重複しないidが割り振られて、最初から最後まで(アプリケーションが起動してから終了するまで、あるいは書類がオープンされてからクローズされるまで)個別に識別されます。

対策

各オブジェクトを識別する場合に、それ専用の属性値を持たせることがあります。

Adobe InDesign:script label AppleScriptから設定・確認が可能なラベル(文字列)を設定できる

もともとある仕組みを本来の目的以外の用途に使うことができるケースもあります。

OmniGraffle:URL urlとかいいつつ、文字列だったらだいたいなんでも入った記憶が

そして、iWork Apps(Keynote、Pages、Numbers)。普段ほとんど使わなくて、AppleScriptから操作できて害のない属性値なんて便利なものがあるわけが……ありました。

Keynoteで使っている例は見かけましたが、他で使ったことのない「reflectin value」。つまり、「反射」属性。

PagesでもNumbersでも使ったことがありません。個人的には、Keynoteでも使ったことがないと思います。

選択状態にあるオブジェクトをもとに何らかの処理を行なって、選択していたオブジェクトを削除する場合に、普通に処理すると(オブジェクトがIndexで管理されているので)、地獄を見ます。

なので、削除対象のオブジェクトのreflection valueに100とか(1〜100のうち、0でないお好きな値を)を設定しておいて、ひととおり処理し終わったら、reflection valueが指定値になっているオブジェクトだけをフィルタ参照で削除する、といった対策が有効です。

実際のAppleScript

前処理Scriptで、最初にreflection valueが何か設定されているオブジェクトが存在しないことを確認したうえで、選択中のオブジェクトのreflection valueに100を設定し……

AppleScript名:削除_前処理.scptd
tell application "Pages"
  tell front document
    set reList to every iWork item whose reflection value is 100
    
if length of reList is not equal to 0 then return
    
    
set aSel to selection
    
repeat with i in aSel
      set j to contents of i
      
set reflection value of j to 100
    end repeat
  end tell
end tell

★Click Here to Open This Script 

処理を行なったあとで、reflection valueに100と設定されているオブジェクトを削除します。

AppleScript名:削除_後処理.scptd
tell application "Pages"
  tell front document
    tell current page
      set aSel to delete (every iWork item whose reflection value = 100)
    end tell
  end tell
end tell

★Click Here to Open This Script 

Posted in Object control | Tagged 13.0savvy 14.0savvy 15.0savvy Keynote Numbers Pages | Leave a comment

新刊電子書籍「AppleScriptでたのしむ レトロ・グラフィック プログラム集」を刊行

Posted on 8月 31, 2024 by Takaaki Naganoya

電子書籍新刊「AppleScriptでたのしむ レトロ・グラフィック プログラム集」を刊行しました。全154ページ、サンプルAppleScriptアーカイブつき。
→ 販売ページ

1980年代や90年代の8/16ビットPCのBASICで描かせていた、三角関数による各種グラフィックスをAppleScriptで再現。ダイアログで表示するだけでなく、各種GUIアプリ(Keynote、Numbers、Pages、Excel、PowerPoint、Word、Pixelmator Pro)を操作して描画したり、画像書き出ししてAirDropでiOSデバイスに転送するようなサンプルを収録しています。

目次

1章 レトロ・グラフィックスの世界

懐かしのレトロCGの世界を再現
時代を経て感じる郷愁とも異なるテイスト
その昔、十数分かけて描いた三角関数グラフ
1秒以下で終了 vs 6分で終了
最新環境で動くAppleScriptにBASICのプログラムを移植
アップルスクリプトは、構文色分け必須の、色で要素を見分ける環境
最低限の知識でAppleScriptによるグラフィックを
AppleScript書類内に、実行に必要なライブラリを同梱
筆者の関数計算ライブラリ「calcLibAS」内蔵関数
コラム ポケコンエミュレータ“pockemul”

2章 早足で紹介するAppleScriptの世界

1994年から採用され続けている言語
GUIアプリを操作するために存在。搭載実行環境がとても多い
書き方は、アプリ内に存在する用語辞書を参照
本来の機能を利用するためにはシステム設定で許可する必要が
10.10以降でCocoaを直接呼べるようになったインタプリタ言語
GUI部品を直接操作してアプリを操作する強制操作機能が人気?
Web上のAPIを呼んでクラウド系の機能も利用
AS自体で予約語と機能を記述するライブラリ機能
コラム AppleScriptの世界の全体像 OS機能の最深部からGUIそのものの操作まで

3章 AppleScriptでグラフィックスを扱う

Cocoaの機能を呼び出してメモリ上で画像を作成
NSAlertの上にNSImageViewを作成しグラフィック表示
Cocoaのグラフィックス座標系”
主要なアプリケーションの座標系”
画像ファイルに書き出せば”
他のアプリにコピー&ペースト”
当時は存在していなかった透過画像”
パラメータを変えると動作が変わる”
コラム GUIアプリごとの応答速度の違い

4章 レトロ・グラフィックスプログラム集

スクリプトエディタでオープンして実行するだけ
必要なライブラリはバンドル内にすべて格納
掲載リストはグラフィックス描画にかかわる箇所のみ
How to use/ダイアログ表示AppleScript
How to use/ファイル出力AppleScript
How to use/ファイル出力+AirDrop AppleScript
How to use/クリップボード転送AppleScript
How to use/各種GUIアプリ操作AppleScript
OS標準搭載の13の実行環境およびサードパーティの数十の実行環境

線画テスト
円画テスト①
円画テスト②
サイクロイド曲線
バラ曲線
パスカルの蝸牛形
リサージュ曲線
ダイヤモンドパターン
アルキメデスの螺旋
メキシカンハット①
メキシカンハット②
メキシカンハット③
メキシカンハット④
コラム マシンごとの実行速度の違い

Posted in Books news | Tagged 13.0savvy 14.0savvy 15.0savvy Excel Keynote Numbers Pages Pixelmator Pro PowerPoint Word | Leave a comment

Numbersで最前面の書類のすべてのシート上の表の行数を合計

Posted on 4月 5, 2024 by Takaaki Naganoya

Numbersの最前面の書類で、全シート上のすべての表の行数を合計して返すAppleScriptです。

大量のシートを持つ書類上のすべての表の行数をカウントします。それぞれの表からは、ヘッダー行の分はカウントしていません。

Numbersは、Pagesのように「表示範囲にないページ上のオブジェクトからの情報取得ができない(その割に指定ページを表示状態にするための機能もない)」といった動作はしないので、カウント対象のシートをいちいち表示状態にして切り替えるという必要はありません。

AppleScript名:全シート上のtableの行数を合計.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2024/04/05
—
–  Copyright © 2024 Piyomaru Software, All Rights Reserved
—

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

set totalC to 0

tell application "Numbers"
  tell front document
    set nList to name of every sheet
    
repeat with i in nList
      set j to contents of i
      
      
tell sheet j
        set tCount to count every table
        
        
repeat with ii from 1 to tCount
          tell table ii
            set hCnt to header row count
            
            
set tmpCount to count every row
            
set totalC to totalC + tmpCount – hCnt
          end tell
        end repeat
      end tell
      
    end repeat
  end tell
end tell

return totalC

★Click Here to Open This Script 

Posted in Object control | Tagged 13.0savvy 14.0savvy Numbers | Leave a comment

Keynote、Pages、Numbers Ver.14.0が登場

Posted on 4月 3, 2024 by Takaaki Naganoya

Keynote、Pages、NumbersのiWorkアプリがバージョン14にアップデートされました。

本バージョンはmacOS 13以降に対応しています。

各アプリのAppleScript用語辞書に変更はありません。Pagesで見られている、ウィンドウで表示されていないページ上のオブジェクトからの情報取得ができない(正確にいえば、表示中の見開き+2見開き分まで取得可能)という挙動は変わっていません。どうも処理速度向上のための仕様のようなので、この部分はこのままだと思います。

Posted in news | Tagged 13.0savvy 14.0savvy Keynote Numbers Pages | Leave a comment

Keynote/Pages/Numbers v13.2がリリースされる

Posted on 9月 22, 2023 by Takaaki Naganoya

iWork……という言葉は最近はあまり使われないようなので、Keynote、Pages、Numbersと呼びますが……これらのアップデート版v13.2が公開されました。AppleScript用語辞書の修正、追加はありません(作成できるグラフ形式が増えているのですが、ASから作成できるようにはなっていません)。

メジャーアップデートのv14.0などではないので、本バージョンは堅実で小刻みな機能アップデート版といえるでしょう。

3Dオブジェクトを格納するUSDZファイルをデータとして挿入できたりアニメーション表示(Keynote)できたり、新しいテーマが追加されたり、その他SVG画像を素材として利用できるようになったもようです。

USDZ形式のファイルを扱えるのは、いまのところ手元のアプリケーションではXcodeとPreview.appのみ。

SVGについては、いろいろ増えてきています。

こうした各種書類形式をキーにして、さまざまなアプリケーションを連携させられるという情報を提供する件をAppleのWWDRに提案したことがありましたが、どこのチームも興味を持たなかったとのこと。

USDZ形式データについては、数年前からこの形式データの利用を広めたいという「意図」が見えたので、いろいろ情報収集はすすめてきました。iWork Appsでサポートするということで、1段階利用が広がったというところですが、たとえばKeynoteで3Dを前提としたアニメーションやトランジッションが実装される、という機能が整備されるまでは単なる素材が1つ増えたぐらいでしょう。

Keynoteに3Dトランジッションや3Dアニメーションを追加するぐらいのことは、とっくの昔から検討されていたと思われますが、おそらく実装してみると「思ったよりも効果的ではない」という結論になったのでしょう。Vision ProのようなxRデバイスで閲覧するという「ブラウズ環境」を整備できたことにより、USDZ形式のデータを広くサポートする「価値」が生まれると踏んだのでしょう。

Vision Proが成功を収めるか、誰もが記憶から追い出したくなるような失敗として記録されるかは不明ですが、USDZ形式の利用が広くサポートされれば、それは多くの人々に役立つものとなることでしょう。

Posted in news | Tagged 12.0savvy 13.0savvy 14.0savvy Keynote Numbers Pages | Leave a comment

Post navigation

  • Older posts

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

Google Search

Popular posts

  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • CotEditorで2つの書類の行単位での差分検出
  • macOS 15, Sequoia
  • 指定のWordファイルをPDFに書き出す
  • Pages本執筆中に、2つの書類モード切り替えに気がついた
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • メキシカンハットの描画
  • Numbersで選択範囲のセルの前後の空白を削除
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • AdobeがInDesign v19.4からPOSIX pathを採用
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響
  • Cocoa Scripting Course 続刊計画
  • AppleScriptによる並列処理
  • macOS 14.xでScript Menuの実行速度が大幅に下がるバグ
  • NaturalLanguage.frameworkでNLEmbeddingの処理が可能な言語をチェック
  • AppleScript入門③AppleScriptを使った「自動化」とは?
  • Keynote/Pagesで選択中の表カラムの幅を均等割
  • Keynote、Pages、Numbers Ver.14.0が登場
  • macOS 15 リモートApple Eventsにバグ?

Tags

10.11savvy (1102) 10.12savvy (1243) 10.13savvy (1392) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (190) 14.0savvy (142) 15.0savvy (120) CotEditor (66) Finder (51) iTunes (19) Keynote (116) 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 (54) 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
  • 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
  • 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年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