GASで別ファイルのスクリプトを実行する方法

GAS
この記事は約6分で読めます。

ちょっとGASで別ファイルのスクリプトを実行したかったので、方法を考えてみました。

ベストプラクティスかどうかは全く考えておりませんので、あしからず。多分、紹介する方法以外にもexecution APIをローカルから叩く方法とかもありますが、今回はあくまでGASで別ファイルのGASを実行することを前提に説明していきます。

Advertisements

やりたいこと

全体像のイメージはこんな感じです。まとめて実行して結果を集約するためのスプレッドシートにあるGASだけ実行して、実行対象1と2のコンテナバインドスクリプトを実行して、シートに表示されたデータをまとめて実行SSのシートにコピーする感じです。

最後のコピー部分は、別にimportRange関数でも事足ります。今回のメインではないので、簡単にGASで作成していますが。

有用なケースは?

以下のようなケースで有効に機能するかな、と思います。

  • 実行対象ファイルのスクリプトを実行させたいタイミングが不規則(トリガーで対応できない)
  • 連動させて一気に実行したい場合
  • データの保存をそれぞれ別シートに置いておいて、フラクタルなデータ構造を(分離環境で)実現したい

同様のことはそれぞれシートを開いてマニュアルでスクリプトを実行することも当然可能ですが、何せ数が増えるとめんどくさいので、今回の方法を利用した方がいいケースもあるかと思います。

20個とか30個とか対象SSがあると一つ一つ開いて実行していくだけでも、かなり手間なので。。

GASで別ファイルのGASを実行する方法〜実装方法〜

以下のステップで実行可能です。要は各実行対象のGASをライブラリ化して、まとめて実行するシート側にライブラリとして利用することになります。

  1. 実行対象シートのスクリプトをライブラリ化する
  2. まとめシートでライブラリをインポートする
  3. Identifierから実行関数を呼び出す

ライブラリを作成・利用する方法は以下の記事をご参照ください。

【ライブラリを作成する方法】

【ライブラリを利用(インポート)する方法】

参考スクリプトと実行結果

それでは一応参考スクリプトと実行結果をみていきます。

スクリプト紹介

【まとめて実行SSのスクリプト】

function aggregation() {
//GASで別環境のGASを実行するためのスクリプト
  target1.setvalue_test()  //実行環境1のシートのスクリプトを実行
  target2.setvalue_test() //実行環境2のシートのスクリプトを実行
  
//ここからは単に実行環境1と2のシートで実行した結果を取得し、まとめて実行SSへコピーするためのスクリプト
  let sheet1 = SpreadsheetApp.openById("1TmoYLWsPfbfkuQeOFuEyhX7MyMalU-dGE2LVVLCRo_4").getSheetByName("シート1");
  let sheet2 = SpreadsheetApp.openById("1DgJ-XOiSLmAwb41Sjq8Ndde6hLPRkaC7BjJ72DRE8xc").getSheetByName("シート1");
  
  let targetsheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("対象1");
  let targetsheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("対象2");
  
  importData(sheet1, targetsheet1)
  importData(sheet2, targetsheet2)
}

function importData(org_sheet, target_sheet){
  let data = org_sheet.getDataRange().getValues();
  target_sheet.getRange(1,1,data.length, data[0].length).setValues(data)
}

【実行環境1スクリプト】

function setvalue_test() {
  let sheet = SpreadsheetApp.openById("実行環境1のシートID").getSheetByName("シート1");
  let data = "実行環境1";
  let row= 1;
  let column =1;
  
  sheet.getRange(row, column).setValue(data);
}

【実行環境2スクリプト】

function setvalue_test() {
  let sheet = SpreadsheetApp.openById("実行環境1のシートID").getSheetByName("シート1");
  let data = "実行環境1";
  let row= 1;
  let column =1;
  
  sheet.getRange(row, column).setValue(data);
}

実行結果紹介

実行対象1を確認すると、以下のように実行対象1のGASが起動してシートに実行環境1と書き込まれています。

実行前

実行後

実行環境2も同様です。

まとめシートの方は、以下のように実行環境1で入力されたデータがコピーされてきています。

実行前

実行後

GASで別ファイルのGASを実行する方法〜注意点〜

注意点はライブラリ作成の場合と同様です。以前ライブラリ関係のシリーズ第4回で紹介した物を抜粋して紹介しておきます。

注意点1 Active系のメソッド

ライブラリはあくまで利用される側の環境で呼び出されます。そのため、アクティブ系のmethod( activespreadsheet/ activesheet/ activecellなど)は呼び出し側環境のスプレッドシートのアクティブなものを取得してしまいます。

https://admin-it.xyz/gas/library-use-ownlibrary-attentions/

一番注意すべきは、実行先のGASでActive系のメソッドを利用している場合、意図した挙動にならないのでご留意ください。

まとめ

GASを別ファイルから実行するための方法を紹介してきました。

本来的にはこのやり方は使わなくても済むならそれが一番で、そういう業務設計をすべきでもあります。ただ、どうしてもできなかったものがあり、GAS側でめんどくささを解消することを目的に利用してみました。

あまりヒットするユースケースではないかもしれませんが、こういうことも当然できるよな(名前が実行可能APIとして導入…なので)というだけの話でした。

コメント