2013-06-29 53 views
9

グローバル変数を変更するためにGoogleのアプリスクリプト(スプレッドシート内)でいくつかの関数を取得しようとしていましたが、わかりません。Google Script(スプレッドシート)のグローバル変数

基本的に変数(この場合は "globalTestVar")を宣言し、2つの関数のいずれか(globalVarTestFunctionOneと2)がこの変数を起動するたびに1ずつ増やす必要があります。

問題は、if(typeof(globalTestVar)== 'undefined')文がそれを処理しなくても、ボタンが押されるたびに変数が再び宣言されることです。

私は最初に変数を宣言し、これらの変数をコード内のどこにでも変更できるObjective CとJavaに慣れています。

これは基本的な質問ですが、私は数時間にわたりグーグルで遊んでいましたが、私はそれを動作させることができません。

logstuff("outside"); 


function logstuff(logInput){ 
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); 
var lastRow = sheet.getLastRow() + 1; 
sheet.getRange("A"+lastRow).setValue(logInput); 
return; 
} 


if (typeof(globalTestVar) == 'undefined') { 
logstuff('declaring global variable'); 
globalTestVar = 0; 

} else { 
logstuff('global variable has been declared'); 
} 



function globalVarTestUIFunction() { 
var app = UiApp.createApplication().setTitle('Test UI'); 
var doc = SpreadsheetApp.getActive(); 
var formPanel = app.createVerticalPanel(); 


var buttonF1 = app.createButton('F1'); 
var buttonbuttonF1ClickHandler = app.createServerClickHandler("globalVarTestFunctionOne"); 
buttonF1.addClickHandler(buttonbuttonF1ClickHandler); 
buttonbuttonF1ClickHandler.addCallbackElement(formPanel); 

var buttonF2 = app.createButton('F2'); 
var buttonbuttonF2ClickHandler = app.createServerClickHandler("globalVarTestFunctionTwo"); 
buttonF2.addClickHandler(buttonbuttonF2ClickHandler); 
buttonbuttonF2ClickHandler.addCallbackElement(formPanel); 


app.add(formPanel); 

formPanel.add(buttonF1); 
formPanel.add(buttonF2); 


doc.show(app); 

return app; 
} 



function globalVarTestFunctionOne() { 
logstuff('globalVarTestFunctionOne'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

function globalVarTestFunctionTwo() { 
logstuff('globalVarTestFunctionTwo'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

出力:ここ

はコードでグローバル変数
  • outside3
  • 宣言グローバル変数を宣言

    • outside3
    • globalVarTestFunctionOne
    • globalTestVarの値:globalTestVarの1
    • outside3
    • グローバル変数を宣言globalVarTestFunctionTwo
    • 値:1

    私はメッセージをプリントアウトするために私自身の機能 "logstuff" を書きました私はLogger.log-機能で作られたものが好きではないからです。

    ありがとうございました!

  • 答えて

    8

    あなたはこれが気に入らないでしょう:GASのグローバル変数は静的なもので、更新することはできず、値を保持することはできません。私もこれを何時間もgoogledしました。

    CacheServiceまたはScriptDBをこの種の問題の可能なストレージとして使用できます。 CacheServiceはすばやく簡単に使用できますが、キャッシュが最終的に期限切れになるため制限があります。私はScriptDbに

    +0

    まあ、それは邪魔です。何らかの種類のグローバル変数を使用する方法がなければなりません。私は回避策を考え、変数を保存/変更してグローバル変数を取得するために "変数"シートを使用しました。しかしそれはあまり優雅ではなく、効率的でもありません。 – Eric

    +0

    私は必要なことをするために 'CacheService'を使いましたが、それはパフォーマンス向上のための短期間の記憶でした。 'ScriptDB'が優れているかもしれませんが、私はそれを試していません。 –

    +0

    はい、cacheServiceは文字列や数値には有効ですが、cacheServiceで配列を格納することは可能ですか? – Eric

    6

    PropertiesServiceしようとしていない - > [プロパティ]現在(2015年)

    を、私は移動するための方法は、クラスPropertiesServiceと戻り値の型Propertiesを使用していると思います。

    グローバルスコープについて私の理解では、スクリプト機能(タイム・トリガ、ユーザーはなど、ボタンを押し、メニュー項目をクリックした)のそれぞれの新しいinvokationは、新しいフルパースにつながります何らかの形で(スプレッドシートの範囲内で、または例えば Propertiesを使用して)永続化されない限り、以前の実行を記憶していないスクリプト。