同期には 4 つのステージがあります。
- 変更されたデータをサーバーと同期するよう、クライアントが準備します。
通常、このステージでは時間はかかりません。このステージが完了すると、同期の進行状況バーが 1/4 まで進みます。 - クライアントが変更されたデータをサーバーに送り、サーバーが変更されたデータとトリガーされたすべての Data Change イベントを処理します。
行われる変更の複雑さ、およびトリガーされる自動化イベント(ある場合)によっては、この段階に時間がかかることがあります。このステージが完了すると、同期の進行状況バーが 1/2 まで進みます。 - クライアントがアプリケーションの最新の定義とデータをサーバーから取得します。
これにはしばらく時間がかかる場合がありますが、通常はステージ 2 より短い時間で完了します。このステージが完了すると、同期の進行状況バーが 3/4 まで進みます。 - クライアントがサーバーによって返されたアプリケーションの定義とデータを処理します。
通常、このステージでは時間はかかりません。
同期エラーは主にステージ 2 で発生します。
- クライアントとサーバーの間でネットワーク エラーが発生した場合、同期が何度か再試行されます。失敗が続くと、同期は停止します。その際は、接続が改善されたのちに再度同期を試してください。
- 接続が悪い場合や、同期の一部として大きな画像を送信する必要がある場合は、このステップに長い時間がかかることがあり、タイムアウトする可能性もあります。その際は、接続が改善されたのちに再度同期を試してください。
同期が失敗しても、リクエストを再試行できます。
エラー: A duplicate request is already in progress
AppSheet クライアントが AppSheet サーバーに同期リクエストを送信する際、クライアントはその同期リクエストを一意に特定できるようにするため RequestId
を含めます。AppSheet サーバーは同期リクエストを受け取ると、同期リクエストとその RequestId
を記憶します。次に、サーバーはクライアントの同期リクエストの処理を開始します。
クライアントの同期リクエストに時間がかかる場合、クライアントは同期リクエストを再送信することがあります。サーバーとのネットワーク接続が失われた場合も、クライアントは同期リクエストを再送信することがあります。どちらの場合も、クライアントが同期リクエストを再送信すると、サーバーはその同期リクエストの RequestId
を使用して、処理中の同期リクエストの一覧を確認します。
サーバーがすでにクライアントの同期リクエストを完了している場合、サーバーは元のクライアントの同期リクエストに返したものとの同じ同期レスポンスを返します。これにより、クライアントの同期リクエストがサーバーで一度だけ実行されること、クライアントが同じ同期リクエストを送信するたびに同じ同期レスポンスを受け取ることを確実にします。
クライアントのリクエストがまだ処理中であることをサーバーが検出すると、次の警告が返されます。
A duplicate request is already in progress
これにより、サーバーがまだ元の同期リクエストを処理していることをクライアントに知らせます。クライアントは待機したのちに再度同期リクエストを送信します。
サーバーがクライアントの元の同期リクエストを処理している間は、クライアントが同期の再試行を試みるたびに A duplicate request is already in progress
という警告が返されます。サーバーが元の同期リクエストを完了すると、クライアントは適切な同期レスポンスを受け取ります。
この警告が繰り返し表示される場合は、Performance Profile を確認して、クライアントの同期リクエストの完了に時間がかかっている原因を特定してください。この警告により、追加、更新、削除の処理に時間がかかっていることがわかる場合があります。追加、更新、削除が、処理に時間のかかる自動化をトリガーしていることがわかる場合もあります。
エラー: Unable to fetch data
同期中に次のようなエラーが表示される場合があります。
The remote server returned an error: (403) Forbidden
クラウド サービスで権限が明示的に拒否されたため、AppSheet のサービスがご利用のクラウド サービス(Google スプレッドシートなど)からデータを取得できないことを意味します。理由は 2 つ考えられます。
- セキュリティ オプション run as app user をアプリで有効にしているため。これにより、Google のサービスはアプリのユーザーの ID を使用してデータにアクセスしようとします。このアプリのユーザーは、該当のデータあるいはスプレッドシートへのアクセス権を持ちません。このオプション(run as app user)は、セキュリティの強化のためだけに使用してください。こうした状況では、エラーは当然表示されます。
- クラウド サービスに置かれたデータまたはスプレッドシートに対するアプリ作成者のアカウントによるアクセスが拒否されたため。共有スプレッドシートからアプリをビルドした後に、そのスプレッドシートに対する作成者のアクセス権を誰かが削除した場合に起こります。
エラー: Unable to update row
アプリと同期に変更を加えた場合、次のようなエラーが表示される場合があります。
Unable to update row in table '<テーブル名>'. Execution of request failed: https://spreadsheets.google.com/feeds/cells/....... Unable to complete sync
.
次のようなエラーが表示される場合があります。
Google sheets service seems to be unresponsive
AppSheet のバックエンドがクラウド ストレージ プロバイダ(この場合は Google スプレッドシート)に変更を送信できない場合に、このエラーが表示される場合があります。これはほとんどの場合、リクエストがタイムアウトすることが原因です。一般的に、Google スプレッドシートにシートをまたいで計算される複雑な数式がある場合は、このエラーが頻繁に表示されます。Google スプレッドシートはすべての数式を再計算するため、スプレッドシートに簡単な変更を加えても完了までに時間がかかります。Google スプレッドシートをシンプルにし、特に、シートをまたいで計算される数式を避ける必要があります。
エラー: This change cannot be applied
サーバー上でアプリの定義が変更された後にクライアントが同期を試行した場合は、次のメッセージが表示されます。
This change cannot be applied because there is a newer version of your app
このメッセージは、例えば、テーブルへの列の追加あるいはテーブルからの列の削除が行われた場合、クライアントのアプリケーションが最新バージョンではない場合に表示されます。列の数が正しくない、または列がない場合にも、エラー メッセージが表示されることがあります。この場合、デバイスのキューに追加されたローカルの変更は、サーバーでは適用されません。
これは、アプリとバックエンド アプリケーションのバージョン番号を比較することで確認できます。アプリのバージョン番号は、左上のメニューをクリックして [About] を選択すれば確認できます。バックエンド アプリケーションのバージョン番号は、対象のアプリケーションをエディタで開き、[Info] > [Properties] ペインに移動すれば取得できます。
このメッセージが表示された場合の対処方法は 2 つあります。どちらの対処方法でも、アプリでキューに追加された変更は復元ファイルにコピーされ、手動でスプレッドシートに適用する必要があります。
Recovery mode
このオプションでは、アプリを Recovery mode にして同期を処理させます。手順は次のとおりです。
- アプリエディタでアプリを開きます。
- アプリエディタの [Manage] > [Deploy] ペインに移動します。
- [Switch to recovery mode] をクリックします。
- 同期が失敗したデバイスで、同期を再試行します。今度は成功するはずです。
- [Manage] > [Deploy] ペインで、[Return to normal mode] をクリックします。
- (アプリのオーナーのクラウド ファイル システム内の)アプリのルートフォルダに、[Recovery] という特別なフォルダがあります。アプリからの変更は、この [Recovery] フォルダの
recovery.txt
ファイルに書き込まれます。行の画像はその後もアプリの通常の画像フォルダに保存されることにご注意ください。 - [Recovery] フォルダで行の値を確認し、必要に応じてスプレッドシートにコピーします。行の値は JSON 形式で保存されます。これらを
http://json2table.com
などのオンライン サービスにコピーして、スプレッドシートにコピーするのに便利な表形式に変換することもできます。
手動での復元
アプリのエンドユーザーは、モバイル デバイスで手動で変更を削除できます。手順は次のとおりです。
- まず、モバイルアプリの左上にある メニューで [Show Changes] をクリックしてアプリの変更を確認します。これにより、手動で変更を処理してデータソースに追加できるよう、変更のコピーを自分自身またはアプリのオーナーにメールで送信できます。
- この方法でも、(アプリのオーナーのクラウド ファイル システム内に)[
Recovery
] という特別なフォルダがアプリのルートフォルダに作成されます。 - アプリのメニューで、[Reset Changes] をクリックします。これにより、待機中の変更を完全に削除し、アプリをバックエンドと同期します。