3

ImportXML 数式をセルに書き込むスクリプトを作成し、数秒後にセルを読み取って戻り値に置き換えようとしました。

問題は、セルをフェッチされた値に置き換えるときに、しばしば (常にではありませんが) #N/A になることです。問題は、正しい値を短時間で見ることができるため、ImportXML によって値が取得され、正しく返されることです。スプレッドシートに書き直されると、めちゃくちゃになります。

コード例:

myformula = '=ImportXML("http://api.something/01.xml","/offers/price")';
sheet.getRange("A1").setFormula(myformula);
Utilities.sleep(5000);
sheet.getRange("A1").setValue(sheet.getRange("A1").getValue());

URL が最近取得された (そして Google によって内部的にキャッシュされた) ときに、正しい値が取得されることに気付きました。

これを解決する方法に関する提案はありますか?

4

1 に答える 1

3

スプレッドシートが再計算を完了したという通知をスクリプトが受信する方法はありません。再計算の経過時間は非決定的です。明らかに、5秒の遅延で十分な場合もありますが、再計算に時間がかかる場合もあります。

sleep()時間枠を延長するには、再試行ループに置き換えてください。

myformula = '=ImportXML("http://api.something/01.xml","/offers/price")';
sheet.getRange("A1").setFormula(myformula);
while (sheet.getRange("A1").getValue() === "#N/A") {
  Utilities.sleep(5000);
}
sheet.getRange("A1").setValue(sheet.getRange("A1").getValue());

しかし、私が言ったように、それが実行されるたびに、セルに正しい値が表示され、それを書き直した後、#N/Aを取得します。つまり、値を書き直さないと、セルに1秒未満で結果が表示されます。–Mille2013年1月14日19:32

これは、クラウドコンピューティングの現実の一部です。スプレッドシートオブジェクトは更新されており、オリジナルのキャッシュされたコピーで作業しているすべてのビューアと共有されています。キャッシュされたコピーは元のコピーと同期されますが、それは瞬時ではありません。シートを表示しているときは、1人のユーザーです。スクリプトは別のGoogleサーバーで「クラウド内」で実行されており、最終的には同じバージョンのスプレッドシートが表示されますが、しばらく時間がかかる場合があります。2人のユーザーが変更(you + script)を行うには、複数の同期操作が必要になるため、影響を受けるセルが不安定になることがあります。

これに似た未解決の問題1131があり、コメントにいくつかの回避策があります。

于 2013-01-14T15:42:27.543 に答える