16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本記事は OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2022 19日目の記事です。

はじめに

プリザンター にはデータベースにログを記録する機能がありますが、特定のテーブルがどの程度閲覧されているか把握する目的には向きません。本記事では記録テーブルとサーバスクリプトを使用し、独自のログを記録する仕組みを作る方法を説明します。

テーブルの設定

ログを記録する「記録テーブル」を作成し、下記のように項目を準備します。ログが膨大にならないように、同じ日に同じ人が同じレコードを閲覧した場合には、閲覧数をカウントアップする仕様とします。

項目 表示名 内容
タイトル タイトル 閲覧したレコードのタイトルを記録
担当者 閲覧者 閲覧した人を記録
分類A 参照ID 閲覧したレコードのIDを記録
数値A 閲覧数 同じ人が同じ日に閲覧した回数を記録
日付A 閲覧日 閲覧した日を記録

サーバスクリプト

閲覧ログを取得したいテーブルに設定します。条件は「画面表示の前」にします。

// 同じ日に同じレコードを閲覧済か既存の履歴レコードを取得する関数
function getRecord(siteId, date) {
    // 既存レコードを取得する条件のデータ
    // Owner: 自分が閲覧したレコードをcontext.UserIdを使用してフィルタ
    // ClassA: 同じIDのレコードをcontext.Idを使用してフィルタ
    // (完全一致にするためColumnFilterSearchTypesをExactMatchに指定)
    // DateA: 同じ日のレコードを引数から受け取った日付でフィルタ
    let data = {
        View: {
            ColumnFilterHash: {
                Owner: `["${context.UserId}"]`,
                ClassA: context.Id.toString(),
                DateA: `["${date},${date}"]`
            },
            ColumnFilterSearchTypes: {
                ClassA: 'ExactMatch'
            }
        }
    };
    // 条件に合致するレコードを取得
    let records = items.Get(siteId, JSON.stringify(data));
    // C#のオブジェクトなのでlengthではなくLengthでチェック
    if (records.Length === 1) {
        return records[0];
    }
}

// 閲覧履歴を作成する関数
function createRecord(siteId, date) {
    // 作成するレコードのデータ
    // Title: 閲覧しているレコードのタイトルをmodel.Titleで取得してセット
    // Owner: 閲覧しているユーザのIDをcontext.UserIdで取得してセット
    // ClassA: 閲覧しているレコードのIDをcontext.Idで取得してセット
    // NumA: 閲覧数1を初期値としてセット
    // DateA 引数から受け取った今日の日付をセット
    let data = {
        Title: model.Title,
        Owner: context.UserId,
        ClassHash: {
            ClassA: context.Id.toString()
        },
        NumHash: {
            NumA: 1
        },
        DateHash: {
            DateA: date
        }
    };
    // 閲覧履歴のサイトに閲覧履歴レコードを作成
    items.Create(siteId, JSON.stringify(data));
}

// 閲覧履歴の閲覧数をインクリメントする関数
function updateRecord(id, count) {
    // 更新するレコードのデータ
    // NumA: 引数から現在の閲覧数を受け取りインクリメント
    let data = {
        NumHash: {
            NumA: count + 1
        }
    };
    // 対象のレコードIDのNumAをインクリメント
    items.Update(id, JSON.stringify(data));
}

// メイン処理

// 編集画面をリクエストしたときにのみ実行
if (context.Action === 'edit') {
    // ログを記録するテーブルのサイトID
    let siteId = 1291;
    // サーバスクリプト内の日時はUTCとなっているためnew Date()とはしない
    // utilities.Today()を使用してローカル時間の今日を取得
    let date = utilities.Today().toLocaleString();
    // 同じ日に同じレコードを閲覧済か既存の履歴レコードを取得
    let record = getRecord(siteId, date);
    if (record === undefined) {
        // 存在しない場合は閲覧履歴を新規作成
        createRecord(siteId, date);
    } else {
        // 存在する場合は閲覧数をインクリメント
        updateRecord(record.ResultId, record.NumA);
    }
}

実行結果

記録テーブルに閲覧履歴が記録できました。その他の分類などをmodelオブジェクトから転記することで、クロス集計などを行うことも可能です。

image.png

16
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?