Google Apps Scriptを使用すると、パラメータを渡すjs関数の実行に問題があります。パラメータを追加すると、ボタンがクリックされたときではなく、ページが読み込まれたときに常にコードが実行されます。
HtmlServiceの例から直接、それはOKです-ボタンが押されたときに実行されます...
document.getElementById('button1').onclick = doSomething;
しかし、以下のように呼び出し(および関数)にパラメーターを追加すると、ページが読み込まれたときに(ボタンが押されたときではなく)1回だけ実行されます...
document.getElementById('button1').onclick = doSomething('with_this_parameter');
この振る舞いについての洞察は大歓迎です...答えが明白であるならば申し訳ありません!
あなたが言う時
_document.getElementById('button1').onclick = doSomething('with_this_parameter');
_
これは、doSomething( 'with_this_parameter')を呼び出してから、戻り値をdocument.getElementById('button1').onclick
に割り当てることを意味します。したがって、コードがその行に到達したときに呼び出されるのはそのためです。値がそのプロパティに割り当て可能かどうかは別の問題ですが、それが呼び出される理由です。
このように使用してください
_document.getElementById('button1').onclick = function(){
doSomething('with_this_parameter');
}
_
参照:このソリューションは Mark Linus によって提供されました。
このようにしてください:
document.getElementById('button1').onclick = function(){
doSomething('with_this_parameter');
}
関数の参照を変数に割り当てるには、次のようにします。
var a = doSomething;
ここで、doSomethingは関数です。
ただし、パラメータを渡してその関数を割り当てる必要がある場合
var a = doSomething(b);
これにより、関数を変数に割り当てているときに、呼び出される予定のときにではなく呼び出されるため、問題が発生します。
これを克服するために、矢印関数または単純な関数を使用して、paramsを使用して独自の関数を呼び出すことができます。
var c = () => doSomething(d);
これは実際にはvar c = Anonymous_functionとして理解されます;
または
var c = function() {
doSomething(d);
}
したがって、次のことができます。
document.getElementById('button1').onclick = () => doSomething('with_this_parameter');
私は通常、次のようにclickHandlerを実行します。
// create button here or get button...
var button1 = document.getElementById('button1').setName('button1');
var clickHandler = app.createServerClickHandler('doSomething');
button.addClickHandler(clickHandler);
function doSomething(e){
var button1 = e.parameter.button1;
<do something with var button>
}
追加するパラメーターはわかりませんが、.setId/getIdまたは.setTag/getTagを介してボタン自体から渡されない場合は、コールバック要素を追加して渡す必要があります。テキストボックスからの場合:
var textbox = app.createTextBox();
var button1 =
app.createButton.setName('button1');
var clickHandler =
app.createServerClickHandler('doSomething').addCallbackElement(textBox);
button1.addClickHandler(clickHandler);
お役に立てれば!