Google スプレッドシートのカスタム関数

Google スプレッドシートには、AVERAGESUMVLOOKUP など、何百もの組み込み関数が用意されています。このような関数だけでは足りない場合は、Google Apps Script を使用して、メートルをマイルに変換する関数や、インターネットからライブ コンテンツを取得する関数など、独自の関数を作成してから、組み込み関数と同様に Google スプレッドシート内で使用できます。

スタートガイド

カスタム関数は、標準の JavaScript を使用して作成されます。JavaScript を初めて使用する場合は、Codecademy の初心者向けの優れたコースをおすすめします。(注: このコースは Google が開発したものではなく、Google と提携しているものでもありません)。

入力値を 2 倍にする DOUBLE という名前の簡単なカスタム関数を次に示します。

/**
 * Multiplies an input value by 2.
 * @param {number} input The number to double.
 * @return The input multiplied by 2.
 * @customfunction
*/
function DOUBLE(input) {
  return input * 2;
}

JavaScript の記述方法がわからない場合や、学習する時間がない場合は、アドオン ストアを確認して、必要なカスタム関数がすでに作成されているかどうかを確認してください。

カスタム関数の作成

カスタム関数を作成する手順は次のとおりです。

  1. Google スプレッドシートでスプレッドシートを作成するか、開きます。
  2. メニュー項目 [拡張機能] > [Apps Script] を選択します。
  3. スクリプト エディタ内のコードをすべて削除します。上記の DOUBLE 関数については、コードをコピーしてスクリプト エディタに貼り付けるだけです。
  4. 上部の保存アイコン()をクリックします。

これで、カスタム関数を使用できるようになりました。

Google Workspace Marketplaceからカスタム関数を取得する

Google Workspace Marketplace には、Google スプレッドシート用アドオンとして、いくつかのカスタム関数が用意されています。これらのアドオンを使用または確認するには:

  1. Google スプレッドシートでスプレッドシートを作成するか、開きます。
  2. 上部にある [アドオン > アドオンを取得] をクリックします。
  3. Google Workspace Marketplace が開いたら、右上にある検索ボックスをクリックします。
  4. 「カスタム関数」と入力して Enter キーを押します。
  5. 興味のあるカスタム関数アドオンが見つかったら、[インストール] をクリックしてインストールします。
  6. アドオンの承認が必要であることを示すダイアログ ボックスが表示されることがあります。その場合は、注意事項をよく読んで [許可] をクリックします。
  7. アドオンがスプレッドシートで使用できるようになります。別個のスプレッドシートでアドオンを使用するには、そのスプレッドシートを開き、上部にある [アドオン] > [アドオンの管理] をクリックします。使用するアドオンを見つけて、[オプション] > [このドキュメントで使用] をクリックします。

カスタム関数を使用する

カスタム関数を作成するか、Google Workspace Marketplaceからインストールすると、組み込み関数と同じように簡単に使用できます。

  1. 関数を使用するセルをクリックします。
  2. 等号(=)の後に、関数名と入力値を入力します(例: =DOUBLE(A1))。Enter キーを押します。
  3. セルに Loading... が一瞬表示され、結果が返されます。

カスタム関数のガイドライン

カスタム関数を作成する前に、知っておくべきガイドラインがいくつかあります。

命名

JavaScript 関数の命名に関する標準的な規則に加えて、次の点に注意してください。

  • カスタム関数の名前は、SUM() などの組み込み関数の名前と区別する必要があります。
  • カスタム関数の名前は、Apps Script のプライベート関数を示すアンダースコア(_)で終わることはできません。
  • カスタム関数の名前は var myFunction = new Function() ではなく function myFunction() 構文で宣言する必要があります。
  • スプレッドシート関数の名前は通常大文字ですが、大文字と小文字は区別されません。

引数

組み込み関数と同様に、カスタム関数は引数を入力値として受け取ることができます。

  • 単一のセルへの参照を引数として関数を呼び出す場合(=DOUBLE(A1) など)、引数はセルの値になります。
  • 引数としてセル範囲への参照(=DOUBLE(A1:B10) など)を指定して関数を呼び出すと、引数はセルの値の 2 次元配列になります。たとえば、下のスクリーンショットでは、=DOUBLE(A1:B2) の引数は Apps Script によって double([[1,3],[2,4]]) として解釈されます。DOUBLE上記のサンプルコードは、配列を入力として受け入れるように変更する必要があります。


  • カスタム関数の引数は決定論的である必要があります。つまり、NOW()RAND() など、計算するたびに異なる結果を返す組み込みのスプレッドシート関数は、カスタム関数の引数として使用できません。カスタム関数がこれらの揮発性組み込み関数のいずれかに基づいて値を返そうとすると、Loading... が無限に表示されます。

戻り値

すべてのカスタム関数は、表示する値を返す必要があります。

  • カスタム関数が値を返すと、その値は関数が呼び出されたセルに表示されます。
  • カスタム関数が値の 2 次元配列を返す場合、その値は、隣接するセルが空である限り、隣接するセルにオーバーフローします。この配列によって既存のセルの内容が上書きされる場合は、カスタム関数はエラーをスローします。例については、カスタム関数の最適化に関するセクションをご覧ください。
  • カスタム関数は、値を返すセル以外のセルに影響を与えることはできません。つまり、カスタム関数は任意のセルを編集することはできず、呼び出し元のセルとその隣接するセルのみを編集できます。任意のセルを編集するには、カスタム メニューを使用して関数を実行します。
  • カスタム関数呼び出しは 30 秒以内に戻る必要があります。一致しない場合、セルに #ERROR! が表示され、セルのメモは Exceeded maximum execution time (line 0). になります。

データ型

Google スプレッドシートでは、データの性質に応じてさまざまな形式でデータが保存されます。これらの値がカスタム関数で使用される場合、Apps Script はそれらを JavaScript の適切なデータ型として扱います。混乱しがちな部分は次のとおりです。

  • スプレッドシートの日付と時刻は、Apps Script の Date オブジェクトになります。スプレッドシートとスクリプトで異なるタイムゾーンが使用されている場合(まれな問題)、カスタム関数で補正する必要があります。
  • スプレッドシートの期間値も Date オブジェクトになりますが、操作が複雑になる可能性があります
  • スプレッドシートのパーセンテージ値は、Apps Script では 10 進数になります。たとえば、値が 10% のセルは Apps Script では 0.1 になります。

予測入力

Google スプレッドシートでは、組み込み関数と同様に、カスタム関数の予測入力がサポートされています。セルに関数名を入力すると、入力内容に一致する組み込み関数とカスタム関数のリストが表示されます。

カスタム関数がこのリストに表示されるのは、そのスクリプトに JsDoc@customfunction タグが含まれている場合です(下の DOUBLE() の例を参照)。

/**
 * Multiplies the input value by 2.
 *
 * @param {number} input The value to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return input * 2;
}

高度

Google Apps Script サービスの使用

カスタム関数は、特定の Google Apps Script サービスを呼び出して、より複雑なタスクを実行できます。たとえば、カスタム関数は Language サービスを呼び出して、英語のフレーズをスペイン語に翻訳できます。

他のほとんどのタイプの Apps Script とは異なり、カスタム関数はユーザーに個人データへのアクセス権の承認を求めることはありません。そのため、個人データにアクセスできないサービス(具体的には次のサービス)のみを呼び出すことができます。

サポート対象のサービス メモ
キャッシュ 動作しますが、カスタム関数では特に有用ではありません
HTML HTML を生成できるが、表示できない(ほとんど役に立たない)
JDBC
言語
ロック 動作しますが、カスタム関数では特に有用ではありません
マップ 経路を計算できるが、地図を表示できない
プロパティ getUserProperties() は、スプレッドシートのオーナーのプロパティのみを取得します。スプレッドシート エディタは、カスタム関数でユーザー プロパティを設定できません。
スプレッドシート 読み取り専用(ほとんどの get*() メソッドを使用できますが、set*() は使用できません)。
他のスプレッドシート(SpreadsheetApp.openById() または SpreadsheetApp.openByUrl())を開くことはできません。
URL Fetch
ユーティリティ
XML

カスタム関数がエラー メッセージ You do not have permission to call X service. をスローする場合、サービスにはユーザー認証が必要であるため、カスタム関数で使用できません。

上記のサービス以外のサービスを使用するには、カスタム関数を記述する代わりに、Apps Script 関数を実行するカスタム メニューを作成します。メニューからトリガーされる関数は、必要に応じてユーザーに承認を求め、結果としてすべての Apps Script サービスを使用できます。

共有

カスタム関数は、作成されたスプレッドシートにバインドされた状態で開始されます。つまり、次のいずれかの方法を使用しない限り、あるスプレッドシートで作成したカスタム関数を別のスプレッドシートで使用することはできません。

  • [拡張機能] > [Apps Script] をクリックしてスクリプト エディタを開き、元のスプレッドシートからスクリプト テキストをコピーして、別のスプレッドシートのスクリプト エディタに貼り付けます。
  • [ファイル] > [コピーを作成] をクリックして、カスタム関数を含むスプレッドシートのコピーを作成します。スプレッドシートをコピーすると、それに添付されているスクリプトもコピーされます。スプレッドシートにアクセスできるユーザーは、スクリプトをコピーできます。(閲覧権限のみを持つ共同編集者は、元のスプレッドシートでスクリプト エディタを開くことはできません。ただし、コピーを作成すると、コピーの所有者になり、スクリプトを表示できるようになります)。
  • スクリプトを Google スプレッドシートのエディタ用アドオンとして公開します。

最適化

カスタム関数がスプレッドシートで使用されるたびに、Google スプレッドシートは Apps Script サーバーに個別の呼び出しを行います。スプレッドシートにカスタム関数呼び出しが数十(または数百、数千)含まれている場合、このプロセスは非常に遅くなる可能性があります。カスタム関数が多数あるプロジェクトや複雑なカスタム関数があるプロジェクトでは、実行が一時的に遅延することがあります。

したがって、広範囲のデータに対してカスタム関数を複数回使用する場合は、関数を修正して、2 次元配列の形式で範囲を入力として受け取り、適切なセルにオーバーフローできる 2 次元配列を返すようにすることを検討してください。

たとえば、上記の DOUBLE() 関数は、単一のセルまたはセルの範囲を受け入れるように次のように書き換えることができます。

/**
 * Multiplies the input value by 2.
 *
 * @param {number|Array<Array<number>>} input The value or range of cells
 *     to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return Array.isArray(input) ?
      input.map(row => row.map(cell => cell * 2)) :
      input * 2;
}

上記のアプローチでは、JavaScript の Array オブジェクトの map メソッドを使用して、セルの 2 次元配列のメソッドを取得し、各行を取得します。次に、各行に対して map を再度使用して、各セルの値を 2 倍にして返します。結果を含む 2 次元配列を返します。このようにすると、下のスクリーンショットに示すように、DOUBLE を 1 回呼び出すだけで、多数のセルを一度に計算できます。(map 呼び出しの代わりに、ネストされた if ステートメントを使用しても同じことができます)。

同様に、次のカスタム関数は、インターネットからライブ コンテンツを効率的に取得し、2 次元配列を使用して 1 回の関数呼び出しで 2 列の結果を表示します。各セルで独自の関数呼び出しが必要な場合、Apps Script サーバーは XML フィードを毎回ダウンロードして解析する必要があるため、処理にかなりの時間がかかります。

/**
 * Show the title and date for the first page of posts on the
 * Developer blog.
 *
 * @return Two columns of data representing posts on the
 *     Developer blog.
 * @customfunction
 */
function getBlogPosts() {
  var array = [];
  var url = 'https://gsuite-developers.googleblog.com/atom.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
  var entries = document.getRootElement().getChildren('entry', atom);
  for (var i = 0; i < entries.length; i++) {
    var title = entries[i].getChild('title', atom).getText();
    var date = entries[i].getChild('published', atom).getValue();
    array.push([title, date]);
  }
  return array;
}

これらの手法は、スプレッドシート全体で繰り返し使用されるほぼすべてのカスタム関数に適用できますが、実装の詳細は関数の動作によって異なります。