susandes-male
@susandes-male

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASのスクリプトファイルのファイルIDの取得について

GASのスクリプトファイルのファイルIDの取得方法について質問します。

スクリプトファイルには次の2種類があることは知っています。
 ・スタンドアロン型
 ・コンテナバインド型

またスクリプトファイルをブラウザなどで開いて、そのURLからファイルIDがわかることも知っています。

私が知りたいのは、スクリプトファイル内で自分のファイルIDをプログラムで取得する方法です。
"this"を使って取得できるかと色々試したのですがダメでした。

フォルダ内のファイル一覧からfileオブジェクトを取得して、ファイルIDを取得する例はあります。
しかし、スクリプトファイル内で自分のfileオブジェクトを取得する方法はあるのでしょうか。

質問が分かりづらいかもしれませんが、よろしくお願いいたします。

0

2Answer

下記の質問について、

私が知りたいのは、スクリプトファイル内で自分のファイルIDをプログラムで取得する方法です。

この場合、次のスクリプトでスクリプトID(Google Apps Script projectのファイルID)取得することができます。このスクリプトを実行したスクリプトIDが返されます。

const scriptId = ScriptApp.getScriptId();
console.log(scriptId);

このスクリプトは、スタンドアロン型とコンテナバインド型の両方で使用可能です。

参考

1Like

Comments

  1. @susandes-male

    Questioner

    早速の回答、ありがとうございます。

    教えていただいた方法で、スタンドアロン型もコンテナバインド型も自分のファイルIDが取得できました。

    SpreadsheetAppクラスは知っていたのですが、ScriptAppクラスというのもあるのですね。
    私が良く参考にしているGASのリファレンスマニュアルには、ScriptAppクラスはありましたがgetScriptIDメソッドは載っていませんでした。
    ScriptAppクラスについてはもう少し勉強しようと思います。

  2. ご返事ありがとうございます。無事に解決できたとのことで安心しました。

    Google Apps Scriptは多くのクラスやそれらのメソッドがあり、さらに頻繁にアップデートや廃止、追加などが行われています。このため、なかなか全てを知ることは難しいかもしれません。最新の情報を知る一つの方法として、Google Apps Scriptのスクリプトエディタが良いかもと思います。スクリプトのコード補完で表示される各クラスやメソッドはその時の最新が掲載されている(と思います)ので、これが参考になるかと思います。さらに、JSDocによる簡単な使い方も表示されます。廃止になった場合はそれも表示されます。これらが何かのお役に立てますと幸いです。

  3. @susandes-male

    Questioner

    ScriptApp.getScriptIdメソッドを用いてスクリプトファイルのファイルIDを取得する件で問題が発生したので質問を再開します。

    問題点の内容
    スクリプトファイルはライブラリの追加により、他のスクリプトファイルの処理を呼び出すことができます。
    この2つのファイルを便宜上次のように呼ぶことにします。
     ・呼び出し側スクリプトファイル
     ・ライブラリ側スクリプトファイル

    問題は呼び出し側スクリプトファイルからライブラリ側スクリプトファイルの処理を呼び出し、
    その処理の中でScriptApp.getScriptIdメソッドを使用すると、取得されるScriptIdは呼び出し側スクリプトファイルのファイルIDになります。

    ライブラリとして呼び出されても、自分(ライブラリ側スクリプトファイル)のファイルIDを取得する方法はあるでしょうか。

  4. ライブラリとして呼び出されても、自分(ライブラリ側スクリプトファイル)のファイルIDを取得する方法はあるでしょうか。

    という新たな質問について、この場合、ライブラリをインストールする際に使用するIDがライブラリのファイルIDです。

  5. @susandes-male

    Questioner

    回答ありがとうございます。

    話の混乱を避けるために、2つのファイルの呼び名を再掲します。
     ・呼び出し側スクリプトファイル
     ・ライブラリ側スクリプトファイル

    呼び出し側スクリプトに別のスクリプトをライブラリとして登録するときに、そのライブラリ側スクリプトのファイルIDを指定するのは知っています。

    私が疑問に思ったのは、ライブラリ側スクリプトでgetScriptIdを実行した時に取得されるファイルIDが実行される環境で異なるということです。
     ・ライブラリ側スクリプトを本体のみで実行した時
       自分(ライブラリ側スクリプト)のファイルIDが取得されます。
     ・呼び出し側スクリプトからライブラリ側スクリプトを呼び出した時
       呼び出し側スクリプトのファイルIDが取得されます。

    グーグルの公式サイトでgetScriptIdの説明を読みました。
    getScriptIdは、以前はgetProjectKeyという名前でその後現在の名前になったのですね。
    ちょっと気になったのは戻り値の説明において、「スクリプトプロジェクトのID」になっていることです。「スクリプトのファイルID」とは書いてありません。
    そうであれば呼び出し側スクリプトからライブラリ側スクリプトを呼び出した時に取得される値が、呼び出し側スクリプトのファイルIDである事は納得します。
    本当は半分くらい不満なのですが。「スクリプトプロジェクトのID」を返すのであればgetScriptIdというメソッド名は適切でなく、getScriptProjectIdのほうが適切だと思います。

    どちらにしてもgetScriptIdでは、実行環境に関係なく自スクリプトのファイルIDを取得することはできない事が判明しました。
    公式サイトの他のページも見てみましたが、私が欲しているような機能を実現するのは無理みたいです。(*)定数として内部に保持するというような代替案は考えられますが。

    ファイルIDに関する質問は、これでクローズにしようと思います。
    でもしつっこいようですが、今回ファイルIDに関して質問するきっかけになったスクリプトのライブラリ登録の件については別スレッドで上げようと思っています。

スタンドアロン型であれば、スクリプトファイルを保存しているフォルダからgetFileByName().getId();とやれば取得できそうですが、コンテナバインド型だとこれは難しいですね。

もし、開発者はIDを事前に確認できてプログラムが自ファイルのIDを参照したい、ということであればPropertiesに登録しておくのも手かなと思いました。
参考

0Like

Comments

  1. @susandes-male

    Questioner

    回答ありがとうございます。

    getFileByName().getId();でやる方法は、私が欲しているのとはちょっと違いますね。
    別な方の回答で私がやりたいことができました。

Your answer might help someone💌