id
Webサービス(価格)から情報を受け取り、取得するカスタムGoogle AppsScriptを作成しました。
このスクリプトをスプレッドシートで使用していますが、問題なく機能します。私の問題は、これらの価格が変更され、スプレッドシートが更新されないことです。
スクリプトを強制的に再実行してセルを更新するにはどうすればよいですか(各セルを手動で確認する必要はありません)。
id
Webサービス(価格)から情報を受け取り、取得するカスタムGoogle AppsScriptを作成しました。
このスクリプトをスプレッドシートで使用していますが、問題なく機能します。私の問題は、これらの価格が変更され、スプレッドシートが更新されないことです。
スクリプトを強制的に再実行してセルを更新するにはどうすればよいですか(各セルを手動で確認する必要はありません)。
回答:
わかりました、私の問題はグーグルが奇妙な方法で動作することだったようです-スクリプトパラメータが類似している限りスクリプトを再実行せず、以前の実行からのキャッシュされた結果を使用します。したがって、APIに再接続せず、価格を再フェッチせず、キャッシュされた前のスクリプト結果を返すだけです。
詳細については、https://code.google.com/p/google-apps-script-issues/issues/detail?id = 888をご覧ください。
そしてここ:更新されていないデータを要約するスクリプト
私の解決策は、スクリプトに別のパラメーターを追加することでしたが、これも使用していません。これで、以前の呼び出しとは異なるパラメーターを使用して関数を呼び出すと、これらのパラメーターの結果がキャッシュにないため、スクリプトを再実行する必要があります。
したがって、関数を呼び出すときはいつでも、追加のパラメーターに「$ A $ 1」を渡します。また、refreshというメニュー項目を作成しました。これを実行すると、現在の日付と時刻がA1に格納されるため、2番目のパラメーターとして$ A $ 1を使用するスクリプトへのすべての呼び出しを再計算する必要があります。これが私のスクリプトからのいくつかのコードです:
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Refresh",
functionName : "refreshLastUpdate"
}];
sheet.addMenu("Refresh", entries);
};
function refreshLastUpdate() {
SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}
function getPrice(itemId, datetime) {
var headers =
{
"method" : "get",
"contentType" : "application/json",
headers : {'Cache-Control' : 'max-age=0'}
};
var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
var jsonObj = eval( '(' + jsonResponse + ')' );
return jsonObj.Price;
SpreadsheetApp.flush();
}
また、ID 5のアイテムの価格をセルに入れたい場合は、次の数式を使用します。
=getPrice(5, $A$1)
価格を更新したい場合は、「更新」->「更新」メニュー項目をクリックするだけです。onOpen()
スクリプトを変更した後、スプレッドシートをリロードする必要があることに注意してください。
これは少し古い質問だと思います。ただし、この方法では、変更を加える以外にユーザーの操作は必要ありません。
私がしたことはtbkn23に似ていました。
再評価したい関数には、未使用のパラメーター$ A $ 1が追加されています。したがって、関数呼び出しは
=myFunction(firstParam, $A$1)
しかし、コードでは、関数のシグネチャは
function myFunction(firstParam)
更新関数を使用する代わりに、次のようなonEdit(e)関数を使用しました
function onEdit(e)
{
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}
この関数は、スプレッドシートのセルが編集されるたびにトリガーされます。したがって、セルを編集すると、A1に乱数が配置され、tbkn23が提案するようにパラメーターリストが更新され、カスタム関数が再評価されます。
NOW()
は組み込み関数であり、カスタム関数ではありません。
カスタム関数が特定の列内にある場合は、スプレッドシートをその列で並べ替えるだけです。
順序付けアクションにより、データが強制的に更新され、その列のすべての行に対してカスタム関数が一度に呼び出されます。
これは非常に古いスレッドかもしれませんが、私がちょうど今だったので、これを行おうとしている誰かにとって役立つかもしれません。
Lexiのスクリプトをそのまま使用すると、現在のスプレッドシートでは機能しなくなったようですが、ダミー変数をパラメーターとして関数に追加すると(実際に関数内で使用する必要はありません)、実際に機能します。 Googleスプレッドシートにページを再度更新するように強制します。
したがって、次のような宣言:function myFunction(firstParam、dummy)を呼び出してから、それを呼び出すと、提案されているとおりになります。それは私のために働いた。
また、編集するすべてのシートに確率変数が表示されるのが面倒な場合、1つのシートに制限する簡単な解決策は次のとおりです。
function onEdit(e)
{
e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
/*@customfunction*/
function sheetNames(e) {
return SpreadsheetApp.getActive()
.getSheets()
.map(function(sheet) {
return sheet.getName();
});
}
/*Create a installable trigger to listen to grid changes on the sheet*/
function onChange(e) {
if (!/GRID/.test(e.changeType)) return; //Listen only to grid change
SpreadsheetApp.getActive()
.createTextFinder('=SHEETNAMES\\([^)]*\\)')
.matchFormulaText(true)
.matchCase(false)
.useRegularExpression(true)
.replaceAllWith(
'=SHEETNAMES(' + (Math.floor(Math.random() * 500) + 1) + ')'
);
}
カスタム関数を作成し、それをスプレッドシートで数式として使用した場合、スプレッドシートを開くか、参照セルが変更されるたびに、数式が再計算されます。
スプレッドシートを見つめ続けてその値を変更したい場合は、セルを更新する時限トリガーを追加することを検討してください。トリガーについて詳しくはこちらをご覧ください