アプリ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 も一緒に登録するしかないのかもしれません。

これで取得した全アプリの情報の中から
指定したappIdのspaceIdを抽出すればスペースIDはわかります。

「いいね!」 1

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);
});

できました。

下記 appIds の 586 はゲストスペース所属、539 は通常スペース所属、
278 はスペース未所属、999 は存在しないアプリIDなのですが、
どれも下図のように、スペースに属していればスペースIDを取得し
そのスペースがゲストか否かの判定も可能でした。

(() => {
    'use strict';

    // レコード一覧画面が表示されたときに処理を開始
    kintone.events.on('app.record.index.show', async () => {

        // 属するスペースのIDと、そのスペースIDが通常スペースかゲストスペースかを調べるアプリ群
        const appIds = [586, 539, 278, 999];

        for (const appId of appIds) {
            try {
                const appInfo = await getAppInfo(appId);

                // アプリIDが存在しなかった場合
                if (!appInfo.apps || appInfo.apps.length === 0) {
                    console.error(`アプリID ${appId} の情報が取得できませんでした`);
                    continue;
                }

                const spaceId = appInfo.apps[0].spaceId;
                console.log(`取得したspaceId (appId: ${appId}):`, spaceId);

                // アプリがスペースに属していなかった場合
                if (!spaceId) {
                    console.log(`アプリID ${appId} はスペースに属していません`);
                    continue;
                }

                const spaceInfo = await getSpaceInfo(spaceId);

                // アプリがスペースに属していたら、通常スペースかゲストスペースかでログを変える
                if (spaceInfo.isGuest) {
                    console.log(`取得したスペースID ${spaceId} はゲストスペースです (appId: ${appId})`);
                } else {
                    console.log(`取得したスペースID ${spaceId} は通常のスペースです (appId: ${appId})`);
                }

            } catch (error) {
                console.error(`エラー発生 (appId: ${appId}):`, error);
            }
        }
    });

    // アプリ情報を取得する関数
    async function getAppInfo(appId) {
        const client = new KintoneRestAPIClient();
        return client.app.getApps({ ids: [appId] });
    }

    // スペース情報を取得する関数
    async function getSpaceInfo(spaceId) {
        const client = new KintoneRestAPIClient();
        try {
            return await client.space.getSpace({ id: spaceId });
        } catch (error) {
            // 通常スペースではなかった場合にゲストスペースと見做して処理を続行
            if (error.code === "GAIA_IL25") {
                console.log(`ゲストスペースの可能性あり (spaceId: ${spaceId}) - ゲストスペース用APIクライアントを使用`);
                const guestClient = new KintoneRestAPIClient({ guestSpaceId: spaceId });
                return await guestClient.space.getSpace({ id: spaceId });
            }
            throw error;
        }
    }
})();
「いいね!」 2

ありがとうございます。

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

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

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

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

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