Numbersでオープン中の複数の書類があったときに、書類Aのすべてのシートの表1を、書類Bの現在のシートの表1にまとめるAppleScriptです。
さすがに、機械的な作業すぎて手で行う気にはなれなかったので、ありもののScriptを利用して作ってみました。
こういう用途のために作っておいたライブラリ「choose multiple list」を利用しています。
BridgePlus内蔵のFrameworkがmacOS 10.14/10.15に邪魔されて認識されない環境では動かせないかもしれません。このあたり、SIP解除するしかないと思わせるものがあります。
ライブラリで複雑な選択を行えるUI部品を作っておいたおかげで、これだけ込み入った動作を行うAppleScriptを書きましたが、Cocoaの機能はほぼ使っていません(getDataFromNumbersDocは作り置きしておいた、頻出ルーチンなので使いまわしています)。choose multiple listライブラリは、こういう用途のために作っておいたものであり、まさにそのぴったりな用途であったといえるでしょう。
AppleScript名:書類Aのすべてのシートの表1を、書類Bの現在のシートの表1にまとめる.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/01/20 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" — High Sierra (10.13) or later use framework "Foundation" use scripting additions use bPlus : script "BridgePlus" use mulList : script "choose multiple list" script spd property allData : {} end script set (allData of spd) to {} set {aName, bName} to getTargetDocNames() of me –「データ取得元」のNumbers書類のすべてのシートの表1から2D Listでデータ取得 tell application "Numbers" tell document aName set sList to name of every sheet repeat with i in sList set tmp2DDat to getDataFromNumbersDoc(aName, i) of me set (allData of spd) to (allData of spd) & tmp2DDat end repeat end tell end tell set aHeight to length of (allData of spd) set aWidth to length of item 1 of (allData of spd) –「データ集約先」のNumbers書類の現在のシートの表1にまとめた2D Listを展開する(巨大すぎると時間がかかるので、CSV書き出ししてオープンするなどの別の方法を採るべき) tell application "Numbers" tell document bName tell active sheet set tRes to make new table with properties {row count:aHeight + 1, column count:aWidth} end tell end tell end tell fillCurrentTable(bName, (allData of spd)) of me –Numbersの書類の現在のシートを、指定の2次元配列でfillする on fillCurrentTable(docName, aList) set aLen to length of aList set aWidth to length of first item of aList tell application "Numbers" tell document docName tell active sheet tell table 1 repeat with i from 1 to aLen tell row (i + 1) set aRowList to contents of item i of aList repeat with ii from 1 to aWidth tell cell ii set aTmpData to contents of item ii of aRowList ignoring application responses set value to aTmpData end ignoring end tell end repeat end tell end repeat end tell end tell end tell end tell end fillCurrentTable –Numbersでオープン中の書類の名称一覧からデータ取得元とデータ集約先の書類名をダイアログで選択 on getTargetDocNames() tell application "Numbers" set nList to name of every document end tell set selList to {nList, nList} set tList to {"データ取得元", "データ集約先"} set {aRes, bRes} to choose multiple list selList main message "各Numbers書類の役割を選択してください" sub message "「データ取得元」のデータを順次、「データ集約先」の表1に連結します" with title lists tList height 140 width 400 return type item contents without allow same items return {aRes, bRes} end getTargetDocNames –Numbersでオープン中の書類の選択中のシートの表1からデータを取得して2D Listに on getDataFromNumbersDoc(aDocName, sheetName) load framework tell application "Numbers" if (count (every document)) = 0 then return false tell document aDocName if (count (every sheet)) = 0 then return false tell sheet sheetName tell table 1 set colCount to column count set rowCount to row count set headerCount to header row count set footerCount to footer row count set dList to value of every cell of cell range end tell end tell end tell end tell –Convert 1D List to 2D List set bList to (current application’s SMSForder’s subarraysFrom:dList groupedBy:colCount |error|:(missing value)) as list set sItem to 1 + headerCount set eItem to rowCount – footerCount set cList to items sItem thru eItem of bList return cList end getDataFromNumbersDoc |
More from my site
(Visited 462 times, 1 visits today)