web-dev-qa-db-ja.com

Google Appsスクリプトでグローバル変数を定義する方法

Googleのほとんどの例は、1つの巨大なスクリプトで関数のみを使用していることです。

例えば https://developers.google.com/apps-script/quickstart/macros

しかし、私たちのスタイルでは、通常、すべての関数を単一の名前空間の下に記述します。

MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: MyCompany.init
    }];
    spreadsheet.addMenu("Test", menus);
};

ただし、上記のコードを実行すると、返されます

"MyCompany is not defined."

の解き方?

41
Ryan

プロパティサービスを一種の永続的なグローバル変数として使用できるため、プロパティサービスを使用した方がよい場合があります。

'ファイル>プロジェクトプロパティ>プロジェクトプロパティ'をクリックしてキー値を設定するか、

_PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue');
_

データは、

var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');

92
AshClarke

GASでは、グローバル変数は他の言語のものとは異なります。これらは、すべてのルーチンで使用できる定数でも変数でもありません。

関数と効率性の間の一貫性のためにもグローバル変数を使用できると思いました。しかし、ここのSOで何人かの人々が指摘したように、私は間違っていました。

グローバル変数は、スクリプトを実行するたびに評価されるため、アプリケーションを実行するたびに1回だけ評価されるわけではありません。
グローバル変数はスクリプト内で変更できます(したがって、偶然に変更できない定数ではありません)が、別のスクリプトが呼び出されると再初期化されます。
グローバル変数を使用すると、速度が低下します。関数内で同じグローバル変数を2回以上使用する場合、ローカル変数を割り当てて代わりに使用する方が高速です。

アプリケーションのすべての関数間で変数を保持したい場合は、cacheServiceを使用するのが最適です。ドライブ上のすべてのファイルとフォルダーをループ処理するには、かなりの時間がかかることがわかりました。しかし、ファイルやフォルダに関する情報をキャッシュ(またはプロパティ)に保存して、少なくとも100倍の速度を上げることができます。

グローバル変数を使用する唯一の方法は、いくつかのプレフィックスとウィジェットの命名です。

5
SoftwareTester

グローバル変数は確かにGASに存在しますが、正しく使用するには、環境のクライアント/サーバー関係を理解する必要があります。次の質問を参照してください。 Googleスクリプトのグローバル変数(スプレッドシート)

ただし、これはコードの問題ではありません。ドキュメンテーションは、メニューによって実行される関数が文字列としてメソッドに提供されなければならないことを示しています、今あなたは関数の出力を提供しています: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#addMenu%28String、Object%29

function MainMenu_Init() {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: "MainMenu_Init"
    }];
    spreadsheet.addMenu("Test", menus);
};
3
Tim

私はグローバル変数のオブジェクトを持つ関数を返すことで回避策を使用しています:

function globalVariables(){
  sheetName: 'Sheet1',    
  variable1: 1,
  varibale2: 2
}

function functionThatUsesVariable (){
  var sheet =   SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}
1
KrzFra

私はこれを使用します。varx = 0を宣言した場合。関数宣言の前は、変数はすべてのコードファイルで機能しますが、スプレッドシートでセルを編集するたびに変数が宣言されます