Pleasanterを快適に活用するためのたった１つのルール

## 前置き
Pleasanterの使い方の話がメインです。
最後におまけスクリプトあり。

## そのルールとは
**「1レコードに記載するのは1テーマのみ」**
ごくごく当たり前のことです。具体的どういうことか。

## コメントの使い方
複数人が同じレコードで情報を共有し、問題を解決するような場合、コメント欄でいろいろコミュニケーションを進めることがあると思います。このコメント欄、何でもかんでも、チャットみたいにやり取りしちゃっていませんか？

![スクリーンショット 2022-08-10 114341_ぼかし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/54cef445-93e4-14e9-ecd9-ae64374a9516.png)
こんな感じでスクロールしないと、コメントが表示しきれない。

## コメントが大量に記載されてしまうことの弊害
Pleasanterには検索機能があります。が、コメントが大量にあると、どこに検索ワードが存在するか、検索結果から該当箇所を見つけるのが大変です。

また、往々にしてこういったレコードには、課題の結論・状況が記載されていないことが多いです。すると、後から見たときに、どんな結論になったのか？そもそもまだ解決していないのか？がわからなくなります。

**コメントの流れから結論を追っかけるのは大変です**

## よくある、コメントが大量に記載されてしまうパターン

課題管理テーブルでのやり取りの例。課題解決後、関連する課題についても議論
例えばこんな流れ．．
1. 課題管理に課題を起票 
1. 課題に対する情報交換をコメント欄で実施
1. その後、課題は解決、ただし追加でさらなる課題発生
1. そのままコメント欄で追加課題について議論・・
→ **「関連する話題なのですが、ｘｘｘについてはどうしましょう？？」** なんて続いてしまうケース

どのような結論となったのか。残タスクはあるのか？その残タスクの状況は？など、コメント欄だけで議論を進めてしまうと、後から状況を把握することが難しくなります。

## じゃあ、どうするか
ということで、冒頭のルールです。
**「1レコードに記載するのは1テーマのみ。」**
前述の例をもとに、どう使うかの具体例を考えてみます。

課題管理の例

1. 課題管理に課題を起票 。
1. 課題に対する情報交換をコメント欄で実施。
1. その後、課題は解決、ただし追加でさらなる課題発生。
1. **新たな課題を、別レコードに起票。もともとのレコードは課題解決済としクローズする。**

さらに、コメント欄でのやり取りだけではなく、課題の結論、状況（完了済）をテーブルの項目に記載したほうがよいでしょう。

## まとめ
大量に記載されたコメントの流れを追っかけるのって、本当に大変なんです(読む気になれない)。  
あとから、あの時こういう結論だったよね？というのを追いかけて探しても、探しきれないことも。テーブルの本来の目的を理解した上で、より効率的なコミュニケーションをとるようにしたいですね。（してくださいお願いします）

## おまけ
Pleasanterのコメントが検索しにくいなら、別レコードで管理すればいいじゃん、ということで、レコードのコメントを取得・分解してリンクしている子テーブルに登録するスクリプトを作ってみました。
#### コメントを普通に書き込むテーブル（親）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/ad32e600-3444-4bae-5de9-d27c86d471b2.png)

#### 親テーブルの詳細画面　コメント分割イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/96eaf667-e613-73f6-7296-5d0c8c11d257.png)



#### 分割したコメントを登録するテーブル（子）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/67a6e40f-c43f-c8a1-c5d3-ee45ae9767a9.png)
→項目「親テーブル」にコメント分割元のテーブルをリンクします。

#### サンプルコード

   処理概要
   1. 親テーブルの情報を[$p.apiGet](https://pleasanter.org/manual/script-api-get)で取得  
   1. コメントがJSONの配列形式となっているのでパース
   1. パースしたコメントを分割先の子テーブルに[$p.apiCreate](https://pleasanter.org/manual/script-api-create)で登録
      ※実際に使用する場合は、functionを[プロセス機能](https://pleasanter.org/manual/process)などから呼び出してください。  
      ※サンプルではCreateしかしないので、細かい処理は適宜調整してください。

```javascript
function DisassemblyComments(){
    //分割元のデータを$p.apiGet取得します。
    //親サイトIDを指定してください（当サンプルコードは記録テーブル想定、サイト全体のコメント取得・分割をします。）。
    //必要であれば、レコード単位で実施するなど調整してください。
    $p.apiGet({
        'id': XXXXX(親サイトID),
        'data':{
            'View':{
                'ApiDataType': 'KeyValues',
                'ApiColumnKeyDisplayType': "ColumnName",
                'GridColumns': ["ResultId","Comments"]
            }
        },
        'done': function (data) {
            //取得したデータ分繰り返し
            for (let val of data.Response.Data) {                
                if(val.Comments != null){
                    //取得したコメントをJsonパース
                    var comentsObj = JSON.parse(val.Comments);
                    //jsonの配列で取得したコメントを1件ずつ処理
                    for (let comment of comentsObj) {                        
                        //分割コメントを子サイトへ$p.apiCreateで登録します
                        //Body→コメント本文を設定
                        //ClassA→親サイトとのリンク項目、登録元のレコードID（ResultId）を設定
                        //ClassB→分割したコメントのIDを設定
                        //ClassC→コメント作成者のIDを設定
                        //DataA→コメント作成日を設定
                        $p.apiCreate({
                            id: XXXXX(子サイトID),
                            data: {
                                ApiVersion: 1.1,
                                Body: comment.Body,
                                ClassHash: {
                                    ClassA: val.ResultId,
                                    ClassB: comment.CommentId,
                                    ClassC: comment.Creator
                                },
                                DateHash: {
                                    DateA: comment.CreatedTime 
                                }
                            },
                            done: function (data) {
                                console.log(data);
                            },
                            fail: function (data) {
                                console.log(data);
                            }
                        });    
                    }
                }    
            }
        },
        fail: function (data) {
            console.log(data);
        }
    });
}
```