GoogleMapAPIを使い位置の取得

お世話になっております、

現在位置情報の取得について不具合が発生しました。

やりたいことは開始時(create.show)開始位置を取得、終了時( create.submit)終了位置を取得。

GeocoderAPIなどを使っております、

現在は位置は取得出来ているらしいか、終了位置のフィールドに位置情報をセット出来ない。正確で言うと、一瞬セットしたか、保存完了時に確認したらなくなっています、そしてレコードID(上部)が住所に変更しています。

位置情報取る前の状態

位置情報とって、保存後の状態

途中は一瞬これになっています。

 

プログラムも添付します。

'use strict';
document.write('<script type="text/javascript" src="//maps.googleapis.com/maps/api/js?key=XXX"></script>');
(function() {
kintone.events.on(['mobile.app.record.create.show'], function(event) {
navigator.geolocation.getCurrentPosition(successCallback, errorCallback, {
enableHighAccuracy: true
});
var record = event.record;
record['開始時間'].disabled = true;
record['結束時間'].disabled = true;
record['address'].disabled = true;
record['address2'].disabled = true;
return event;
});
})();
(function() {
kintone.events.on(['mobile.app.record.edit.show'], function(event) {
var record = event.record;
record['開始時間'].disabled = true;
record['結束時間'].disabled = true;
record['address'].disabled = true;
record['address2'].disabled = true;
return event;
});
})();
(function() {
kintone.events.on(['mobile.app.record.create.submit'], function(event) {
navigator.geolocation.getCurrentPosition(successCallback2, errorCallback, {
enableHighAccuracy: false
});
var record = event.record;
var date = new Date();
var datetime = moment(date).format('YYYY/MM/DD HH:mm:ss');
record['結束時間']['value'] = moment(datetime).toISOString();
return event;
});
})();
// 処理成功時のコールバック関数
var successCallback = function(p) {
var geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);
geocoder.geocode({
latLng: latlng
}, function(res, status) {
if (status == google.maps.GeocoderStatus.OK) {
var data = kintone.mobile.app.record.get();
data["record"]["address"].value = res[0].formatted_address;
kintone.mobile.app.record.set(data);
} else {
alert("geocode 取得に失敗 :" + status);
}
});
}

var successCallback2 = function(e) {
var geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(e.coords.latitude, e.coords.longitude);
geocoder.geocode({
latLng: latlng
}, function(res, status) {
if (status == google.maps.GeocoderStatus.OK) {
var data = kintone.mobile.app.record.get();
data["record"]["address2"].value = res[0].formatted_address;
kintone.mobile.app.record.set(data);
alert("geocode 取得成功 :" + status);
} else {
alert("geocode 取得に失敗 :" + status);
}
});
}

// 処理失敗時のコールバック関数
var errorCallback = function(e) {
alert(e.message);
}

consoleも全くエラーメッセージがなくて、戸惑っています、見解やアドバイスお願い致します。

'mobile.app.record.create.submit’内の、

navigator.geolocation.getCurrentPositionが、非同期処理なので、

kintone.Promiseでラップしてreturnしないと、

mobile.app.record.create.submitが、保存処理を待ってくれないからではないでしょうか?

あと、successCallback2内では、kintone.mobile.app.record.get()からではなく、
event.recordにセットしてはどうでしょうか。

PV様

ご回答ありがとうございます。

非同期処理について了解しました、修正します。

 

successCallback2のコードについては、1と同じくget,setになっています、これじゃあダメですか?

var data = kintone.mobile.app.record.get();
kintone.mobile.app.record.set(data);

'mobile.app.record.create.submit’の最後のreturn event;で、

kintoneに登録するデータが決まりますが、そのタイミングで、

event[“record”][“address2”].valueに値は入ってますか?

 

動かしてみたわけではないので確かなことは言えないのですが、

var data = kintone.mobile.app.record.get();
kintone.mobile.app.record.set(data);

だと、'mobile.app.record.create.submit’内の、

event[“record”][“address2”].valueに値は入ってなさそうに見えたので。

PV様

一瞬入ってました、

なのでmobile.app.record.create.submitの瞬間には入っていると思います、

けどsuccessごはまだ消えました、ちょっと不可解です、、、

入っていると思いますという文言から推測すると、

デベロッパーツールで、return event;をブレークポイントで止めて、

event[“record”][“address2”].valueを確認は行っていないのでしょうか?

 

もし確認してないようでしたら、

https://www.atmarkit.co.jp/ait/articles/1403/20/news050.html

https://ics.media/entry/190517/

この辺りを参考にしながら確認してみてください。

PV様

確かに、ブレークポイントで止めれば確認出来るはず!

失礼いたしました。この方式で確認してみます!

'mobile.app.record.create.submit’の中で、

kintone.mobile.app.record.get() をした際の挙動に関してこちらでもテストしてみました。

 

非同期処理をkintone.Promiseで待つようにコードが正しくなっていれば、

kintone.mobile.app.record.get()の呼び出し時に、

You cannot call kintone.mobile.app.record.get() in handler or during processing a handler.

のエラーを吐くようになっているみたいです。

 

ですので、まずはkintone.Promiseがまだうまくいってなさそうなので確認と、

kintone.mobile.app.record.get()から、event.recordに変える必要がありそうです。

PV様

なるほど、色々テストしてもらってありがとうございます。

その方向でテスト、修正してみます。