「KEIKAK (or KOYOMI) で非公開予定は作れますか？」に対する (非公式な) 回答

この記事は [kintone アドベントカレンダー 2023](https://qiita.com/advent-calendar/2023/kintone) の 13 日目の記事です。
今年のアドベントカレンダーも折り返しですね！

**【大事な前提】**

この記事では弊社製品 **[KEIKAK](https://morinohi-arces.jp/service/keikak/)** に関して言及していますが、本記事の内容は筆者（私）の個人的な見解であって、弊社としての公式な見解とは異なる可能性があることをご留意ください。
本記事の記述については弊社への問合せはお控えいただき、筆者宛てにコメント等でご連絡いただくようお願いします。

## はじめに

弊社では 2023/11/01 に kintone 用新プラグイン **[KEIKAK](https://morinohi-arces.jp/service/keikak/)** を正式リリースしました。

![01-keikak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/3844645a-2647-f033-72f9-38e62140cb5c.png)

従来より弊社では

- リスト＆カード形式で ToDo 管理を行う [KANBAN](https://morinohi-arces.jp/service/kanban/)
- ガントチャート形式でタスク管理を行う [KOUTEI](https://morinohi-arces.jp/service/koutei/)
- カレンダー形式でスケジュール管理を行う [KOYOMI](https://morinohi-arces.jp/service/koyomi/)

と言う大きな製品を ３ つ展開しておりましたが、

> これらのプラグインを同時に使うことはできないんですか？

と言う問合せは結構な頻度で頂いておりました。

このたびリリースしたプロジェクト管理プラグイン **KEIKAK** の開発の出発点はまさにそこであり、**同じ予定・タスクを利用シーンやポジションにより様々な切り口で表示・編集できる** というのが KEIKAK の最大のポイントであるわけです。
既存 3 製品に対しこれまでにユーザーの皆さんから頂いていました様々なご要望も取り込みつつビジュアル面でも大きくブラッシュアップした、まさに **プロジェクト管理の決定版** と言う気概でリリースした製品であります。

今日はそんな中でも、本プラグインの **スケジュール機能** についてお話したいと思います。

## よくあるお問合せ

まあ言ってもタイトルにもある通りですが、そして既存製品である **KOYOMI** でもしばしばありましたが、

> KEIKAK（or KOYOMI）では「非公開予定」を作成することはできますか？

と言うご質問を、ご利用のユーザー様、あるいはご利用を検討される方などからそこそこの頻度で頂きます。
併せて、

> 他社製品ではできるものもあるようですが

と言うお言葉を頂くこともあり。

実際のところどうなのか？
この記事ではそのあたりを深掘りしていきたいと思います。

## 「非公開予定」を作ることはできるのか？

**KEIKAK** あるいは同じくスケジュール機能を持つ **KOYOMI** で、「非公開予定」を作成できるのか。

できるできないで言えば、 `できるとも言えるしできないとも言える` です。

**できるできないで言ってないじゃん** と言うツッコミが不可避かも知れませんが、もう少し詳しくご説明します。

## そもそも「非公開予定」とは？

ユーザー様が求める、そして一般的な解釈として **非公開予定** と言った場合、以下のような要件を想定するものと考えます。

- 予定参加者は通常通り **予定名も内容も時間も確認できる**
- 参加者以外は **予定があることとその時間だけは分かるが予定名や内容は確認できない**
  - この場合予定名は参加者以外には `予定あり` などの形で見える
- **「完全に隠す」** と言うオプションにより **参加者以外には存在自体を秘匿する** こともできる

これはグループウェアである [サイボウズガルーン](https://jp.cybozu.help/g/ja/admin/application/scheduler/initial.html#admin_application_scheduler_initial_03) や [サイボウズ Office](https://jp.cybozu.help/of10/ja/admin/app/sh/period.html#admin_app_sh_period_03) の非公開予定の仕様と同じものです。
2 番めの予定があることと時間が分かることはとても重要で、これによって予定の重複を避ける機能に影響しないことを確保できるわけです。

## 考察

上記の 3 つのポイントを踏まえてもう少し細かく見ていきましょう。
1 番目の項目はスケジューラーとして当然の機能なので省いておきます。
2 番めの **参加者以外の人は予定があることとその時間だけは分かるが予定名や内容は確認できない** について検討していきます。
**KEIKAK のアプリテンプレート** から作成したアプリをベースに、いくつかのアイデアを考えてみましょう。

### kintone 標準の [アクセス権](https://kintone.cybozu.co.jp/material/pdf/kintone_guidebook_vol08.pdf) をうまく活用する

以下のような設定を試してみます。

- フィールドタイプが **チェックボックス** である **カテゴリ** フィールドに選択肢 `非公開` を追加する
- レコードのアクセス権で **カテゴリ** が `非公開` を含むレコードのアクセス権を **参加者（kintone）** だけにし、 **Everyone** を除外する

![02-keikak-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/8c42e74c-a425-0ae2-6f32-ec883c7f96fa.png)![03-record-acl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/e42aebe3-edde-28db-173a-036071ccb690.png)

この設定により、**参加者（kintone）** に登録されているメンバーにしかその予定が見えない非公開予定を作成することができるようになります。

![04-natsume-save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/573a3842-f519-3c4e-b74c-3a423c431662.png)![05-natsume-hidden.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/eae8e571-8735-9696-7e9f-850bb1b4e6e8.png)
`↑ 「参加者（kintone）」に「夏目 漱石」を指定し、「カテゴリ」を「非公開」とした予定は、他のユーザーからは見えなくなる。`

KOYOMI の場合はこのような用途に使えるフィールドがありませんが、**区分** フィールドに `非公開` と言うオプションを追加することによって同じようなアプローチが可能です。
（非公開予定に細かい区分をつけることはできなくなりますが）

![06-koyomi-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/25df1cce-561c-c542-1078-04d017f68bef.png)![07-koyomi-acl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/27dc77a1-540b-1ec7-e4a6-4597303fbc56.png)


#### このやり方の注意点

繰り返しになりますが、このやり方で登録した予定は **参加者以外には予定の存在すら把握できない** ものとなります。
つまりサイボウズガルーンやサイボウズ Office で言うところの、そして上に挙げたの 3 つのポイントのうちの 3 番めの **「完全に隠す」** オプションを有効にした場合と同じ挙動と言うことです。

上記の `他社製品` についても、この設定方法を案内していると見受けられます。
（もしかしたらそうでないものもあるかも知れませんが）

この設定で十分な考慮が必要なのは、 **他のユーザーが自分の非公開予定にかぶるように予定を登録する可能性がある** という点の是非です。
何しろ他のユーザーは非公開予定が存在しているのかただ予定が空いているのかを区別するすべはないのですから。

それでも問題ない、そこらへんは運用でなんとか巻き取ると言うのであれば、この方法は有効でしょう。
そしてこの方式なら、現在リリースされているバージョンの KEIKAK 及び KOYOMI でも **既に実現可能** です。

しかし一般的に **非公開予定** と言った場合、他のユーザーには「細かい事は分からないがこの人はこの時間なんか予定があるんだな」と言う事は少なくとも把握できる機能（「予定あり」を表示する）が求められるでしょう。
これは果たして実現可能でしょうか。

### 「予定あり」を表示する方法を考える

:::note warn
先に申し上げますが、ここから記述することは現在の KEIKAK や KOYOMI に実装されているものに関する話ではなく、また今後実装が予定されている機能に関する言及でもありません。
あくまで思考実験としての解説です。
:::

**「予定あり」** と言う表示を行い内容を事細かに把握できないようにするためには、予定レコードの **カテゴリ** フィールドの `非公開` がチェックされているレコードの場合には詳細は表示しないでおくと言うアプローチが考えられます。
その判断のためには、当然ながら **レコードの閲覧権限** が必要です。
したがってさっきの設定項目の **レコードのアクセス権でコントロールする** と言うアプローチは使えません。

それでは、レコード自体は閲覧できるとして、表示のタイミングでコントロールすると言うアイデアはどうでしょう。

#### 表示時に非公開かどうか判定する

以下のようなアプローチを考えます。

- 画面表示前に全てのレコードについて **カテゴリ** フィールドの値を評価する
- `非公開` にチェックが入っている場合、画面上には `予定あり` として表示し詳細は出さない

一見すると実装は容易そうです。
ただし、「予定あり」が表示されるのはあくまで **表示上の機能（KEIKAK の機能）** に過ぎず、kintone 標準のレコード一覧画面や詳細画面にまで効果を波及させることはできません。

それでは、実装範囲を拡大し、レコードの一覧画面や詳細画面でも各レコードの **カテゴリ** フィールドの値を評価して出し分けるのはどうか？

これに関しても技術的に可能かどうかと言えば **可能** です。

しかしながら、たとえ一見すると「予定あり」となっていて内容が秘匿されているように見えても、**通信の中でレコードの完全な情報が流れる** 事自体を防げているわけではありません。
（レコードのアクセス権で閲覧が可能になっているのですから当然ですね）
ブラウザのデベロッパーツールなどで通信内容を把握・解析する程度のスキルを持つ人にとっては、**このアプローチは完全に無力**です。
そう言うスキルがない人にとっては十分に有効な解法に見えますが、破る手立てがある以上は開発者サイドからはこれを以て「非公開機能を実装しました」とは到底自信を持ってご提供できるものではないわけです。
（それで非公開予定としたものが他者に漏れたとしてもこちらとしては責任を負えない）

したがって **この方法で非公開予定を実装することは恐らくこの先もない** でしょう。

#### API トークンを駆使する

[API トークン](https://jp.cybozu.help/k/ja/glossary/api_token.html) はユーザー権限とは独立して kintone のレコード操作が可能な仕組みです。

現在の KEIKAK 及び KOYOMI では、プラグイン画面上でのレコードの取得・編集・削除の操作はユーザー自身のアクセス権を利用しています。
ここにうまく介入する考え方はないでしょうか。

最初の方の

- フィールドタイプが **チェックボックス** である **カテゴリ** フィールドに選択肢 `非公開` を追加する
- レコードのアクセス権で **カテゴリ** が `非公開` を含むレコードのアクセス権を **参加者（kintone）** だけにし、 **Everyone** を除外する

を設定した上で、 API トークンを払い出して **レコード閲覧** だけできるように割り当てます。

![08-api-token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/c7474b2b-30e1-88d7-047a-7a956c50d823.png)

さらに、プラグイン側でアプリのレコードを取得する際は、ユーザー権限ではなくこの API トークンを使用するように実装する。
その上で表示前に全レコードの **カテゴリ** フィールドの値を評価し `非公開` が含まれていれば表示から除外する。

この方法は、**レコード一覧や詳細画面では完全に参加者以外に非公開予定を秘匿できる** という点でメリットになります。
ただし、プラグイン表示画面においては、1 つ前の項目同様 **通信の中でレコードの完全な情報が流れる** 点は変わりなく（権限が自分自身か API トークンかの違いだけ）、これも十分に有効な解法とはなり得ません。

#### kintone の機能改善に期待する

元も子もない言い方になってしまいますが、現状を考えるとこれより他なさそうです。
具体的には、**[フィールドのアクセス権](https://jp.cybozu.help/k/ja/user/app_settings/rights/field_rights.html) に対しての機能改善** です。
現在フィールドのアクセス権はそれぞれのフィールドに対してユーザー・組織・グループ単位で閲覧・編集を許可するかしないかだけを設定できる仕様です。
ここに [レコードのアクセス権](https://jp.cybozu.help/k/ja/user/app_settings/rights/record_rights.html) 同様にレコードの条件を指定することができるようになれば、一般的に求められる **非公開予定** の実現の目が出てきます。

具体的には、**カテゴリ** が `非公開` を含むレコードについて、**予定の種類**、**参加者（kintone）**、**開始日時**、**終了日時**、それに **カテゴリ** などについては閲覧できるようにし、それ以外のフィールドは閲覧不可とすると言う設定です。
こうすることにより、**カテゴリ** が `非公開` を含むかどうかでプラグイン画面表示時に「予定あり」と出し分けることもでき、かつ通信内容としても権限のない情報が含まれることも避けられるようになるわけです。

みんなが [kintone の改善に協力](https://kintone.form.kintoneapp.com/public/83399336a903f1f3a9b3874c8eef4d2541eb0b88a2875a0120727949d5543d16) すればもしかしたらサイボウズさんも検討してくれるかも知れませんね・・・！！？

# まとめ

と言うわけで、弊社プラグイン KEIKAK および KOYOMI に対して頂くお問合せ **「非公開予定は作れますか？」** について、実現のアプローチを考えました。
改めて解答をまとめると、

- フィールドの選択肢と「レコードのアクセス権」を組み合わせて利用することで **完全に隠す** に相当することは **現時点でも実現可能**
- **「予定あり」** に相当する機能は現在の kintone の仕様上 **どうやっても実現不可**（プラグイン単体でできる範囲を超えている）

と言う結論となります。

kintone そのものは毎月アップデートが行われていますし、将来的にフィールドに対しより事細かなアクセス権が実装される可能性もないわけではないでしょう。
そうなれば皆さんが、そして何より我々自身が切望する「非公開機能」の実装に手が届くことになるかも知れません。
我々ベンダー側ができることは限られていますが、ユーザーの皆さんの大きなリクエストがあれば潮目が変わる・・・かも知れません・・・ね！！？

以上、お読み頂きありがとうございました！