まずビルドHの断面性能を表示する関数を作成してみる。 typescriptはswitch文が使えるようなので、型の文字列で分岐させる。 switchって便利でついつい使ってしまうので(C#のswitch式とか結構好き)、Python書くときはちょっとめんどくさく感じてしまう。 まあ、同じ処理を複数の書き方できてしまうのが微妙なのはわかるんだけど。
実装していない型については例外処理をしたいが、カスタムFunctionにはエラー処理があるらしいので、それで実装する。
カスタム関数のエラーを処理して返す - Office Add-ins | Microsoft Learn
型の文字列が間違っているだからinvalidValueかな?
エラーメッセージを作成するのにPythonのフォーマット済文字列みたいなのを使おうと思ったのだけど、typescriptではバッククオートで囲むらしい。
「`」らしいんだけど、なにこれ、「'」とは違うの??? とりあえずコピペで入力したら動いた。
断面性能の計算については、 せいA、幅B、ウェブ厚t1、フランジ厚t2として、 さらにせいからフランジ厚2枚分を引いた内法せいをa、幅からウェブ厚を引いた幅をbとすれば、
断面積:全体から内側を引く
今気づいたけど、StbSecBuild-Hってせいの記号Aだけど、断面積の記号と被るからST_FUNCとしては微妙な気もするな・・・。
強軸断面二次モーメント:全体から内側を引く
弱軸断面二次モーメント:フランジとウェブそれぞれ求めて足す
また、前回記事で、関数名が全部大文字になってわかりにくいと嘆いていたけど、下記サイトをみるとどうやら小文字も指定できるらしい。
カスタム関数用の JSON メタデータの自動生成 - Office Add-ins | Microsoft Learn
@customfunctionの後ろに引数を2つ指定できて、それがidとnameになって、nameがExcelに表示できるとのこと。このnameは小文字を使うとそれがちゃんと反映されるようだ。
以上をもとに作成したコードが下記。
/** * 組立H形鋼の断面性能。 * @customfunction secBuildH secBuildH * @param propertyType 表示したい断面性能のタイプ * @param a 成 A * @param b フランジ幅 B * @param t1 ウェブ厚 t1 * @param t2 フランジ厚 t2 * @returns 断面性能 */ export function secBuildH(propertyType:string, a:number, b:number, t1:number, t2:number):number{ const a_in:number=a-2*t2; const b_in:number=b-t1; switch(propertyType){ case 'A': return b*a-b_in*a_in; case 'Iy': return (b*a**3-b_in*a_in**3)/12.0; case 'Iz': return (t2*2*b**3+a_in*t1**3)/12.0; default: let error = new CustomFunctions.Error(CustomFunctions.ErrorCode.invalidValue, `[${propertyType}]は正しくないタイプ名です`); throw error; } }
早速試してみる。 build+startを実行。
無事に関数が動いているのがわかる。
計算結果の確認をする。 BH-1200x400x19x25
計算結果はあっていそう。また、エラーメッセージもちゃんと表示された。
不満なのは、通常の関数を入力するときに出てくるこんな感じの
補完機能が出てきてくれないこと。うまく表示する方法はないのかしら?
関数の表示画面からは、概要と、引数の名前を確認することができる。
しかし、挿入画面に入るとなんか変な表示に。
本来はこんな感じで表示されるはず
メタデータのつけ方は間違っていない気がするけど、何がいけないんだろう??
ちょっと気になる点は残ったものの、オリジナルの関数の作成をすることができた。 だいぶそれっぽくなってきたな。
今回のコミット secBuildH関数の作成 · st-func/st_func_addin@69afbf8 · GitHub