Keynoteの現在オープン中の書類の、現在表示中のスライド(ページ)上にある、選択中の表オブジェクトの、選択中のセルに入っているマルつき数字(①②③….)を左から順番にリナンバーするAppleScriptです。
以前のバージョン(v2)では処理対象行や列をダイアログ上で選択するようになっていましたが、本バージョンではKeynote上で処理対象のセルを選択しておくことで処理範囲をScript側に知らせるようにしました。
選択範囲のセルのデータを取得し、それらに入っているマルつき数字の最小値を計算し、ユーザーに開始値としてダイアログで確認を行います。前バージョンと違ってユーザーに確認するのはこの点だけです。
すぐに選択範囲のセルのテキスト冒頭に入っているマルつき数字をリナンバーします。本Scriptにおけるマルつき数字の範囲は1から50です(白地のマルつき数字に限る)。
AppleScript名:選択中の表の指定行・列のマル付き数字リナンバー v3.scpt |
— – Created by: Takaaki Naganoya – Created on: 2021/12/03 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" — macOS 10.13 or later use framework "Foundation" use scripting additions set aOffset to 0 –現在選択中の表オブジェクトを取得 set curTable to returnSelectedTableOnCurrentSlide() of me if curTable = false then return –現在選択中の表オブジェクト中の選択範囲(range)を取得 set aRange to returnSelectedRangeOnCurrentSlide() of me if aRange = false then display dialog "" return end if –現在選択中の表オブジェクト中の選択範囲中のセルをすべて取得(1D List) using terms from application "Keynote" tell curTable set cellList to every cell of range aRange end tell end using terms from –現在選択中の表オブジェクト中の選択範囲中のセルの値をすべて取得(1D List) set aList to returnSelectedTableCellDataOnCurrentSlide() of me set bList to cleanUp1DList(aList, missing value) of me —データ中に丸つき数字が存在した場合には、最小のものを取得 set aOffset to (getMinimumNumFromNumberWithSign(bList) of me) –一応、ユーザーに推測した開始値でよいか確認を取る set dRes to text returned of (display dialog "丸つき数字の開始値:" default answer (aOffset as string)) try set aOffset to (dRes as number) – 1 on error set aOffset to 0 end try –Keynoteの表のセルから取得したデータから丸つき数字を除去する set cList to removeNumberWithSignFromList(bList) of me –list中の各アイテムの冒頭に順次丸つき数字を追加する set dList to {} set aCount to 1 repeat with i in cList set j to convNumToNumWithSign(aCount + aOffset) of me set jj to contents of i set the end of dList to (j & jj) set aCount to aCount + 1 end repeat –リナンバー対象のセルをリナンバーした丸つき数字+内容で置換 set aCount to 1 using terms from application "Keynote" tell curTable repeat with i in cellList set value of i to contents of item aCount of dList set aCount to aCount + 1 end repeat end tell end using terms from –1~50の範囲の数値を丸つき数字に変換して返す on convNumToNumWithSign(aNum as number) if (aNum ≤ 0) or (aNum > 50) then return "" set aStr to "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿" set bChar to character aNum of aStr return bChar end convNumToNumWithSign –1D List上で指定データを検索してヒットしたアイテム番号を返す on search1DList(aList, aTarg) set anArray to current application’s NSMutableArray’s arrayWithArray:aList set anIndex to anArray’s indexOfObject:aTarg if (anIndex = current application’s NSNotFound) or (anIndex > 9.99999999E+8) then return false end if return (anIndex as integer) + 1 –convert index base (0 based to 1 based) end search1DList –1D listのクリーニング on cleanUp1DList(aList as list, cleanUpItems as list) set bList to {} repeat with i in aList set j to contents of i if j is not in cleanUpItems then set the end of bList to j else set the end of bList to "" end if end repeat return bList end cleanUp1DList –text in listから丸つき数字を除去する on removeNumberWithSignFromList(aList as list) set bList to {} repeat with i in aList set j to contents of i set j2 to removeNumberWithSign(j) of me set the end of bList to j2 end repeat return bList end removeNumberWithSignFromList –文字列から丸つき数字を除去する on removeNumberWithSign(aStr as text) set aNSString to current application’s NSString’s stringWithString:aStr return (aNSString’s stringByReplacingOccurrencesOfString:"[\\U000024EA-\\U000024EA\\U00002460-\\U00002473\\U00003251-\\U000032BF\\U000024FF-\\U000024FF\\U00002776-\\U0000277F\\U000024EB-\\U000024F4\\U00002780-\\U00002789\\U0000278A-\\U00002793\\U000024F5-\\U000024FE]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, aNSString’s |length|()}) as text end removeNumberWithSign –1D Listに入っているテキストから丸つき数字を抽出して数値化し、最小のものを求める on getMinimumNumFromNumberWithSign(aList) set nList to {} repeat with i in aList set j to contents of i –与えられたテキストのうち、丸つき数字(白)の set j2 to holdNumberWithSignOnly(j) of me set n2List to characters of j2 –複数の丸つき数字が入っている場合に対処 repeat with ii in n2List set jj to contents of ii set tmpNum to decodeNumFromNumWithSign(jj) of me set the end of nList to tmpNum end repeat end repeat set anArray to current application’s NSArray’s arrayWithArray:nList set cRes to (anArray’s valueForKeyPath:"@min.self") as integer return cRes end getMinimumNumFromNumberWithSign –指定文字列から丸つき数字のみ抽出する on holdNumberWithSignOnly(aStr as text) set aNSString to current application’s NSString’s stringWithString:aStr return (aNSString’s stringByReplacingOccurrencesOfString:"[^\\U000024EA-\\U000024EA\\U00002460-\\U00002473\\U00003251-\\U000032BF\\U000024FF-\\U000024FF\\U00002776-\\U0000277F\\U000024EB-\\U000024F4\\U00002780-\\U00002789\\U0000278A-\\U00002793\\U000024F5-\\U000024FE]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, aNSString’s |length|()}) as text end holdNumberWithSignOnly –丸つき数字を数値にデコードする v2 on decodeNumFromNumWithSign(aStr as string) set numStr1 to "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿" set numStr2 to "❶❷❸❹❺❻❼❽❾❿⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴" set numStr3 to "➀➁➂➃➄➅➆➇➈➉" set numStr4 to "➊➋➌➍➎➏➐➑➒➓" set numStr5 to "⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾" set nList to {numStr1, numStr2, numStr3, numStr4, numStr5} repeat with i in nList set numTemp to contents of i if numTemp contains aStr then using terms from scripting additions set bNum to offset of aStr in numTemp end using terms from return bNum end if end repeat return false end decodeNumFromNumWithSign –現在のスライド上で選択中の表オブジェクトへの参照を取得する on returnSelectedTableOnCurrentSlide() tell application "Keynote" tell front document tell current slide try set theTable to first table whose class of selection range is range on error return false –何も選択されてなかった場合 end try return theTable end tell end tell end tell end returnSelectedTableOnCurrentSlide –現在のスライド上で選択中の表オブジェクト内の選択中のセルの値を取得する on returnSelectedTableCellDataOnCurrentSlide() tell application "Keynote" tell front document tell current slide try set theTable to first table whose class of selection range is range on error return false –何も選択されてなかった場合 end try tell theTable set vList to value of every cell of selection range set cCount to count of column of selection range set rCount to count of row of selection range if rCount > 1 then return false –複数行選択されていた場合にはエラーを返す return vList end tell end tell end tell end tell end returnSelectedTableCellDataOnCurrentSlide –現在のスライド上で選択中の表オブジェクト内の選択中の範囲(range)のnameを取得する on returnSelectedRangeOnCurrentSlide() tell application "Keynote" tell front document tell current slide try set theTable to first table whose class of selection range is range on error return false –何も選択されてなかった場合 end try tell theTable set aPref to properties of selection range set aRangeStr to name of aPref return aRangeStr end tell end tell end tell end tell end returnSelectedRangeOnCurrentSlide |