質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

239閲覧

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

extusr

総合スコア31

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2024/03/16 04:30

編集2024/03/16 08:04

実現したいこと

外部から読み込んだライブラリで定義している関数をスプレッドシートのセルから呼び出したい

前提

外部ライブラリで定義している関数を別のスプレッドシートで呼び出したいと考えております。
外部GASはスクリプトID「Test」として読み込みました。

呼び出し元のライブラリのコード

var getText = () => { return "This is text."; }

呼び出し先のGASでのコード(成功)

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

呼び出し先のスプレッドシートでセルでの呼び出し(2パターンいずれも失敗)

=Test.getText()
=getText()

発生している問題・エラーメッセージ

上述のとおり、GAS内で呼び出すことには成功したのですが、同様にセルでの数式記述で呼び出そうとしても「不明な関数」とエラーが出力され呼び出すことができませんでした。

ご回答いただきましてありがとうございます。
お教えいただいた方法で無事セル内からの呼び出しがおこなえました。

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

イメージ的には以下のような方法なのですが、セルに「数式の解析エラーです。」とエラーが出力されてしまいました。

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

function getTest() { return Test; }

呼び出し先のスプレッドシートでセルでの呼び出し(失敗)

=getTest().getText()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

=test()

コメント内の質問(及び追加質問)に対する回答

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

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

呼び出し先のGASでのコード(呼び出し先のGASに、↓のコードを1つだけ書いて保存)

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スプレッドシートを使っている限り、無理なものは無理なので、諦めてください。)

投稿2024/03/16 07:07

編集2024/03/16 09:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extusr

2024/03/16 08:04 編集

ご回答いただきましてありがとうございます。 お教えいただいた方法で無事セル内からの呼び出しがおこなえました。 共通化したい関数が複数ある場合、その関数の数だけスクリプト内に関数を用意する必要が出てしまうため、ライブラリ自体を呼び出す関数をひとつだけ用意し、それを介してライブラリ内の関数にアクセスすることはできないものでしょうか。 イメージ的には以下のような方法なのですが、セルに「数式の解析エラーです。」とエラーが出力されてしまいました。 ・呼び出し先のGASでのコード function getTest() { return Test; } ・呼び出し先のスプレッドシートでセルでの呼び出し(失敗) =getTest().getText()
退会済みユーザー

退会済みユーザー

2024/03/16 08:48

追記しました。
extusr

2024/03/16 11:47

ご回答いただきましてありがとうございます。 ご提案いただいた方法にて期待どおりの挙動を実現できました。 evalを使った使った力業でしか実現できないということですので、そもそも共通化についての私の考え方に誤りがあるのではないかと思いましたので、そのあたりの一般的な実装方法につきましても学習してまいりたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問