Google Apps Script の基本的なドキュメントやチュートリアルをいくつか読みました。コード実行の「範囲」に関する説明は見つかりませんでした。
これが私がこれまでに理解していることです:
All code consists of one or more statements
All statements must (?) be contained in a "function"
(a slight different from non-google javascript? - is this a false assumption?)
All functions reside in a container called a "file"
Each "file" is part of a "project" container (or library)
Each project container is stored in a "spreadsheet" container.
これらは「物理的な」(編集アクセス) 境界です。
私の質問は、実行中のステートメントの「論理的」境界とは何ですか?
JavaScript が Web ページで動作するのと同様に、すべての変数/オブジェクトがスコープ内でグローバルであると想定することから始めました。「編集アクセス」コンテナーが変数/オブジェクト定義の範囲を制限するとは思いませんでした。私は間違っていた。
「ライブラリ」構造は PHP の「インクルード」操作に似ていると思いました。これにより、同じコード セットをすべてのアプリケーション (スプレッドシート コンテナー) にコピーする必要がなくなり、既に「テスト済み」のコードを使用する必要がなくなると考えました。含まれるプロジェクトで使用できるリソースは、含まれるプロジェクトの共通リソースで使用できるリソースと同じであると想定しました)。要するに、私は間違っていました。「プロパティ」は定義スプレッドシートに保存され、含まれるプロジェクトによって「所有」されていると見なされます。
それをいじってみると、「プロジェクトキー」が新しい「名前空間」をスプレッドシートコンテナーに追加するだけであることがわかりました。各名前空間で発生することは、その名前空間に残ります。名前空間間の唯一の (最も単純な) 通信は、関数パラメーターと戻り値を介したものです。
特に、ユーザーとプロジェクトのプロパティはスコープが設定され、それらを含むスプレッドシート ドキュメントに残ります。スプレッドシート ドキュメント内の各プロジェクトには、個別のユーザー プロパティとプロジェクト プロパティのセットがあります。
同じプロジェクト/ライブラリ名が複数のスプレッドシート ファイルに表示される可能性があり、完全に独立しています。
これはどこかに文書化されていますか?また、スコーピング (同じプロジェクト/ライブラリを共有するさまざまなアプリケーションからのスレッド間の通信) について知っておく必要がある他のことはありますか?
また、関数がライブラリ スコープで定義されたオブジェクトへの参照を返す場合、それは呼び出し元のプロジェクトで保持されますか? プロジェクトの UserProperties "サービス" オブジェクトを指す変数を渡したり戻したりして、別のプロジェクトのそのデータにアクセスできますか?