record型変数に対して、ラベルを指定して変更するAppleScriptです。各種データ型に対応しています。
AppleScriptの属性値ラベル付きデータであるrecord型変数は、さまざまな操作のための方法が(まっとうな手段では)存在せず、使いこなすためにはまっとうでない方法がよく使われてきました(動的にrecordを生成するAppleScriptのテキストを作成してrun scriptで実行するとか。提唱者本人が書いているので間違いない)。
特定のラベルを指定してデータを取り出したり、設定したりはできますが、ラベルを動的に生成して設定するようなことはできませんし、指定のラベルが存在するかどうかを確認する機能もありません(エラートラップを仕掛けて値の取り出しを確認するぐらい?)。
macOS 10.10で全面的にCocoaの機能が利用できるようになってからは、recordを操作するにはCocoaのオブジェクト(NSDictionary, NSMutableDictionary)に変換し、Cocoaの機能を使って加工することが一般的になってきました。
CocoaのNSDictionary/NSMutableDictionaryにはAppleScriptのGUIアプリケーションのオブジェクトは格納できませんが、アプリケーションのオブジェクトを扱わない用途には問題ありません。
本Scriptは、そんな中で(巨大なAppleScriptのプログラムを書く中で)些細なサブルーチンを整備する必要があったために書いたものです。こういう細かい部品を積み重ねていくと、いろいろと巨大な概念を積み上げていくのに便利なもので。
数値に足し算しかできないの? という指摘はあるかもしれませんが、そこはマイナスの数を指定することで引き算は実現できます。
もちろん、この処理はPure AppleScriptだけで書くこともできます。
set aRec to {columnAdr:2, rowAdr:2, tableName:"table1", sheetName:"Sheet1", docName:"numbTest", cellValue:"AAA"}
set tmpVal to aRec’s rowAdr
set tmpVal to tmpVal – 1
set aRec’s rowAdr to tmpVal
return aRec
–> {columnAdr:2, rowAdr:1, tableName:"table1", sheetName:"Sheet1", docName:"numbTest", cellValue:"AAA"}
★Click Here to Open This Script
本ルーチン(↓)では、記述性を高め、取り出したり入れたりといった記述を省略することが目的です。
# 本ルーチンを実戦投入してみたら、意外と使えなかったというオチが(^ー^;;;
AppleScript名:recordの値をラベルを指定して変更.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/07/23 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aRec to {columnAdr:2, rowAdr:2, tableName:"table1", sheetName:"Sheet1", docName:"numbTest", cellValue:{"AAA"}} –Number set bRes to changeRecByKeyAndOperator(aRec, "rowAdr", 2) of me –> {rowAdr:4, docName:"numbTest", cellValue:"AAA", tableName:"table1", sheetName:"Sheet1", columnAdr:2} –String set cRes to changeRecByKeyAndOperator(aRec, "docName", ".numbers") of me –> {rowAdr:2, docName:"numbTest.numbers", cellValue:"AAA", tableName:"table1", sheetName:"Sheet1", columnAdr:2} –List set dRes to changeRecByKeyAndOperator(aRec, "cellValue", {".numbers"}) of me –> {rowAdr:2, docName:"numbTest", cellValue:{"AAA", ".numbers"}, tableName:"table1", sheetName:"Sheet1", columnAdr:2} –Date (Date value is localized in each locale (This is Japanese locale format). Change Date format in your locale format. It depends on System Preferences > International) set bRec to {columnAdr:2, rowAdr:2, theTime:date "2019年1月1日 火曜日 0:00:00", sheetName:"Sheet1", docName:"numbTest", cellValue:{"AAA"}} set eRes to changeRecByKeyAndOperator(bRec, "theTime", 10) of me –> {theTime:date "2019年1月1日 火曜日 0:00:10", rowAdr:2, docName:"numbTest", cellValue:{"AAA"}, sheetName:"Sheet1", columnAdr:2} on changeRecByKeyAndOperator(aRec as record, aKey as string, aVal as {date, list, number, string}) set aDict to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec set tmpVal to aDict’s valueForKey:aKey –指定キーの存在チェック。存在しない場合には元の値をそのまま返す set tmpKeyList to (aDict’s allKeys()) as list if aKey is not in tmpKeyList then return aRec set tmpVal to tmpVal as {date, list, number, string} set tmpClass to class of tmpVal if tmpClass = integer then aDict’s setValue:(tmpVal + aVal) forKey:aKey else if tmpClass = string then aDict’s setValue:(tmpVal & aVal) forKey:aKey else if tmpClass = list then aDict’s setValue:(tmpVal & aVal) forKey:aKey else if tmpClass = date then aDict’s setValue:(tmpVal + aVal) forKey:aKey end if return aDict as record end changeRecByKeyAndOperator |