スプレッドシートのセルから外部ライブラリの関数を呼び出す方法

スプレッドシートのセルに、直接外部ライブラリのスクリプトIDを指定してその外部ライブラリの関数を呼び出そうとしてもエラーになります。(スクリプトIDはスクリプト内でしか有効でないため)

そのようなことをしたい場合は、結果を表示したいスプレッドシートのスクリプトの関数内で、その外部ライブラリの関数を呼び出して、その結果を取得しスプレッドシートに返すというやり方になります。

・呼び出し先のGASでのコード

function test() { return Test.getText()); // This is text. }

・呼び出し先のスプレッドシートでセルでの呼び出し

=test()

共通化したい関数が複数ある場合、その関数の数だけスクリプト内に関数を用意する必要が出てしまうため、ライブラリ自体を呼び出す関数をひとつだけ用意し、それを介してライブラリ内の関数にアクセスすることはできないものでしょうか。

全く推奨しませんが下記のようなやり方は不可能ではありません。

function func(funcname, ...args) { return eval("Test."+funcname+"("+args.join()+")"); }
=FUNC("共通コード用GAS内にある呼び出したい関数名",引数);

たとえば、呼び出し元の共通コード用のGASに、3つの引数をとってその合計を返すcalcTotalと言う関数と、2つの引数をとってその積を返すcalcMultipleという関数があるとする。
コードで書くと

function calcTotal(a,b,c) { return a+b+c; } function calcMultiple(x, y) { return x * y; }

のような。

この場合、呼び出し先のスプレッドシートのセルに

=FUNC("calcTotal", A1,A2,A3)

と入れれば、セルA1とA2とA3の合計が返ってきます。

=FUNC("calcMultiple", E3,E5)

と入れれば、セルE3とE5の積が返ってきます。

ただし、このcalcTotalを呼び出す場合、呼び出し元の3つの引数のうち1つも空白セルであってはダメです。(calcTotal関数内で空白文字のエラー処理していたとしても、です)
同様にcalcMultipleを呼び出す場合、2つの引数のうちいずれも空白セルでない必要があります。

このように、少なくとも指定できる引数に制限があるため、100%希望する動作にならない可能性は高いです。
また、返せる値にも制限がある場合があります。
そもそもevalは安易に使うべきではありません。
(当然ですが、質問者さんがどういう関数を共通用のGASに書いているかについて全部開示されていない以上、全部の関数について、上のfuncが動作することを保証することなどできませんし、動作しない場合にその原因を教えることもできません。上記は力業であり、スプレッドシートからのカスタム関数呼び出しには制限があることを理解してください。仮に上で動かない関数がある場合であっても、Googleスプレッドシートを使っている限り、無理なものは無理なので、諦めてください。)

コメントを投稿

0 コメント