1

Google Apps Scriptを使用しています。複数の関数で使用できるグローバル変数(配列など)を作成しようとしていますが、 Google Spreadsheetが機能するために必要です。グローバル変数の値が複数の関数で使用できない

コード:

var infoSheetArray = null; 

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Custom Menu') 
     .addItem('Fetch Info', 'grabInfo') 
     .addItem('Run Program', 'itemSetup') 
     .addToUi(); 
} 

function grabInfo() { 
    var infoSheet = SpreadsheetApp.openByUrl('....'); 
    infoSheetArray = infoSheet.getSheetValues(1, 1, infoSheet.getLastRow(), 10); 
}  
+0

あなたのコードを表示すると、なぜあなたが試しているものが動作しないのかが分かります。 – jfriend00

+0

先に行ってコードを掲載しました。 – mds93

+0

エラーが表示されますか? –

答えて

3
あなたのコードで

infoSheetArrayは、それはあなたのプログラム内のすべてのコードによってアクセス可能であることを意味し、グローバルスコープを持つ変数です。あまり明白でないのは、あなたのプログラムが異なる "マシン"で複数回実行されていることです。そのため、infoSheetArrayがリセットされているように見えることがあります。

スクリプトの各個別の実行は、新しい実行インスタンスで実行され、それぞれのインスタンスは「グローバル」の独自のセットを持ちます。たとえば、スニペットの例では、onOpen()は、スプレッドシートがWebエディタで開かれたときに独立して呼び出される自動トリガ機能です。ユーザーメニューの拡張機能を使用してを別個にという2つの機能、grabInfo()itemSetup()(図示せず)があります。

これらの3つの関数のいずれかが個別に呼び出されると、実行インスタンスが作成され、プログラムがロードされてから実行が開始されます。すべてのグローバルステートメント(たとえばvar infoSheetArray = null;)が最初に評価され、続いて特別にトリガーされた関数が評価されます。グローバル変数に加えられた変更は、変更が発生した実行インスタンス内でのみ持続され、そのインスタンスが必要な間だけ維持されます。関数が完了すると、インスタンスが吹き飛ばされます。

実行インスタンス間で値を保持する必要がある場合は、Properties ServiceExternal Databaseなどの保存方法を使用する必要があります。

+0

優秀な説明。 Googleは始めのページでこれを強調する必要があります。彼らは、JSの新規参入者を、一般的なWeb /クライアントサイドアプリケーション向けのCodeAcademy JavaScriptチュートリアルに導き、そのために誤解を招いています。 GASの多くの新規参入者にとって障害となっています。元の質問者には、面倒なことがあるプロパティサービスを使用する代わりに、可能であればスプレッドシート自体を使用して「グローバル」値を格納してみることをお勧めします。プロパティとキャッシュのサイズも制限され、キャッシュの有効期限が切れます。 –

関連する問題