アプリIDからゲストスペースIDを取得する方法

アプリA に複数のアプリの期限日をまとめて持っています。
フィールドは、期限日・件名・アプリID・レコードID の 4つです。

カレンダー表示をした時に、期限日の日に件名を表示し、アプリID・レコードID で示されるレコードの詳細ページへのリンクを張ります。
リンク先のアプリが一般スペース内であった場合は、
https://xxxx.cybozu.com/k/${appId}/show#record=${recId}
でいいのですが、ゲストスペース内のアプリの場合は、
https://xxxx.cybozu.com/k/guest/${spcId}/${appId}/show#record=${recId}
としなければなりません。

そこで、以下のコードでアプリId からスペースID を調べようとしましたが、アプリId がゲストスペース内のアプリの場合は、
「ゲストスペース内のアプリを操作する場合は、リクエストの送信先を「/k/guest/(ゲストスペースのID)/v1/…」にします。」というエラーになります。
ゲストスペースのID を知りたいのに、それを指定しないと得られないというのは困りました。

アプリID からゲストスペースか否かと、スペースID を知る方法がありましたら、ご教授ください。

kintone.api(kintone.api.url('/k/v1/app', true), 'GET', {
  id: appId
}).then(function(resp){
  console.log(resp);
});

p.s.
アプリA への登録は、別の各アプリからレコードの登録・更新時に REST APIを通して登録しています。
その時に、自分がゲストスペースか否かを調べて、スペースId も一緒に登録するしかないのかもしれません。

1件のアプリの情報を取得する - cybozu developer network

を見ると、appIdからspaceIdは取得できますが、そのスペースが「ただのスペース」なのか、「ゲストスペース」かはわかりません。

spaceIdからそのスペースがゲストスペースかどうかは返値にありますが、そもそも問い合わせるURLが違うため、どちらかを試して結果を受けて処理を変更する必要がありそうです。
スペースの情報を取得する - cybozu developer network

spaceIdとappIdを組みあせてゲストスペースかどうかアクセスしてみたほうが早いかも知れません。
または、質問の最後にあるようにレコードを書き込むときにURL内に /k/guest/ があるかないかを見てレコードに保存しておくことになりそうです。

「いいね!」 1

ありがとうございます。
いろいろ試行錯誤してみていて、お返事が遅くなり申し訳ありません。

Qiita の記事通りにやると、全アプリの情報が取れたのですが、
毎回全アプリの情報を取得するのはどうかと思い、
client.app.getApp({ id: appId });
を試すと、やはりゲストスペース内のアプリに対してはエラーとなってしまいます。
そこで、getApps() に アプリID(配列)が指定できるのを見つけ、
client.app.getApps({ ids: [appId] });
とやってみました。
あとは、これで得られたスペースID を基にスペース情報を取得すれば、それがゲストスペースか否かがわかるだろうというところまで来ました。
現在、スペース情報の取得でつまづいていますが、あと少しの所だと思います。

const client = new KintoneRestAPIClient();
const appId = 5;		//本当はここは動的に取ってきます
client.app.getApps({
	ids: [ appId ],
}).then((resp) => {
	//ここ以降がうまくいかない
	if(resp[0].spaceId !== undefined && resp[0].spaceId !== null){
		client.space.getSpace({
			id: resp[0].spaceId,
		}).then((resp2) => {
			console.log(resp2);
		}).catch((error2) => {
			console.log(error2);
		});
	}
}).catch((error) => {
	console.log(error);
});

また、明日以降報告致します。

ありがとうございます。

spaceIdからそのスペースがゲストスペースかどうかは返値にありますが、そもそも問い合わせるURLが違うため、どちらかを試して結果を受けて処理を変更する必要がありそうです。

そうなんです。
ただ、試してみて、エラーが発生したらというのがうまくいかず、また気持ち悪いので、もみじさんから戴いたヒントを基にした方法を試しています。

昨日の resp[0].spaceId は間違っていました。
resp.apps[0].spaceId が正しかったのですが、それでも結局 getSpace()で、以下のエラーになります。

ゲストスペースを操作する場合、リクエストの送信先に「/guest/(ゲストスペースのID)」を含める必要があります。

その後もいろいろ試しましたが、無理そうなので諦めて期限日カレンダーアプリにスペースIDを持たせる方向に変更します。

const client = new KintoneRestAPIClient();
const appId = 5;		//本当はここは動的に取ってきます
client.app.getApps({
    ids: [ appId ],
}).then((resp) => {
    if(resp.apps[0].spaceId !== undefined && resp.apps[0].spaceId !== null){
        client.space.getSpace({        //ここで、ゲストスペースの場合エラー
            id: resp.apps[0].spaceId,
        }).then((resp2) => {
            console.log(resp2.isGuest);
        }).catch((error2) => {
            console.log(error2);
        });
    }
}).catch((error) => {
    console.log(error);
});

ありがとうございます。

お時間を割いてお試しいただき申し訳ありません。
やはり、スペース情報取得を試してみてエラーなら、別インスタンスで再試行しかないという事ですね。

私もいろいろ試してみましたが、結局アプリA にスペースID フィールドを持つのが一番シンプルですっきりするので、そうします。

せっかく調べていただいて、教えていただいたのに申し訳ありません。

ありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。