Keynote書類の現在表示中のスライド(ページ)中の選択中の「表」において、指定の行、指定のヘッダー列以降のセルに対して、(1)丸つき数字の削除 (2)丸つき数字の最小値の計算 を行い、丸つき数字の番号降り直しの開始値をユーザーに確認したうえで、丸つき数字部分のみのリナンバーを行います。
本ScriptはmacOS 12+Keynote v11.2で作成・動作確認を行なってあります。それほどOSおよびKeynoteのバージョンに依存するような処理は行なっていないため、上記以外のOSおよびKeynoteのバージョンの組み合わせでも動くと思います。
初期状態では、
と、丸つき数字のナンバリングが項目の入れ替えなどで正しく並んでいない状態を想定しています。
リナンバー対象の表を選択した状態で本Scriptを実行すると、
リナンバー対象行の問い合わせを行います。一番左の列のデータを抽出して選択させます。この場合には、「名称」を選択します。
次に、リナンバー対象データの列指定を行います。指定列「以降」から「末尾」までをリナンバー処理対象とみなします。この場合には「名称」を選択します。
最後に、丸つき数字のリナンバー開始数値を確認します。
すでに、対象範囲のデータを取り出して丸つき数字の最小値については計算してあるので、その確認のためにダイアログ入力を求めます。推測した数値でよければOKを、修正の必要があれば数値を変更したうえでOKボタンをクリック。
適切に処理が行われれば、丸つき数字部分のリナンバーが完了することでしょう。
AppleScript名:選択中の表の指定行・列のマル付き数字リナンバー v2.scpt |
— – Created by: Takaaki Naganoya – Created on: 2021/11/26 — – 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 –選択中のKeynote書類上の表への参照を取得する set aTable to returnSelectedTableOnCurrentSlide() of me if aTable = false then display notification "No selected table on Keynote document" return end if –行選択 using terms from application "Keynote" tell aTable tell column 1 set aList to value of every cell end tell end tell end using terms from set a2List to cleanUp1DList(aList, missing value) of me set aRes to choose from list a2List with prompt "リナンバー対象の行選択" set a2Res to search1DList(a2List, first item of aRes) of me –列選択 using terms from application "Keynote" tell aTable tell row a2Res set bList to value of every cell end tell end tell end using terms from set b2List to cleanUp1DList(bList, missing value) of me set bRes to choose from list b2List with prompt "リナンバー対象の列選択(ヘッダー末尾列)" set b2Res to search1DList(b2List, first item of bRes) of me –リナンバー対象のデータを取得(対象データのみ抽出) using terms from application "Keynote" tell aTable tell row a2Res set bList to value of cells (b2Res + 1) thru -1 end tell end tell end using terms from —データ中に丸つき数字が存在した場合には、最小のものを取得 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 aTable tell row a2Res repeat with i from (b2Res + 1) to ((length of bList) + 1) set value of cell i to contents of item aCount of dList set aCount to aCount + 1 end repeat end tell 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 –現在のスライド上で選択中の表オブジェクトへの参照を取得する 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 –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 |