Kintone アプリのレコードの作成日時を変更？してみる。

# ０．はじめに

Kintone アプリのレコードの作成日時を変更？してみる。としましたが…、

以下のページにもある様に、登録済みのレコードの作成日時は変更出来ない仕様みたいなので、

* [レコード作成日時フィールドのデータを一括で更新をしたい – cybozu developer network](https://developer.cybozu.io/hc/ja/community/posts/203000490-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%97%A5%E6%99%82%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%B8%80%E6%8B%AC%E3%81%A7%E6%9B%B4%E6%96%B0%E3%82%92%E3%81%97%E3%81%9F%E3%81%84)

正確には、レコードの作成日時を指定して、新たに登録し直す。

になります。

今回は、上記機能の Python スクリプトを作成してみました。

# １．Python スクリプト

```python:Kintone_replicateRecords.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

# ---1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----

# ==============================================================================
#
# Kintone_replicateRecords.py
#
# ==============================================================================

# kintone REST APIの共通仕様 – cybozu developer network
# https://developer.cybozu.io/hc/ja/articles/201941754-kintone-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98
# レコードの登録（POST） – cybozu developer network
# https://developer.cybozu.io/hc/ja/articles/202166160

import sys
import os
import logging
import codecs
import json
import datetime
import requests
import time

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

logging.basicConfig(level=logging.DEBUG,
    format="[%(asctime)s] %(levelname)-8s %(filename)-20.20s (%(lineno)06d) %(funcName)-12.12s | %(message)s",
    datefmt='%Y-%m-%d %H:%M:%S',
    filename=(__file__ + ".log"),
    filemode='w')

sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
formatter = logging.Formatter("[%(asctime)s] %(levelname)-8s (%(lineno)06d) | %(message)s")
sh.setFormatter(formatter)
logging.getLogger().addHandler(sh)

logging.debug("<<<<<<<< %s Start >>>>>>>>", __file__)

# ------------------------------------------------------------------------------
# Constant
# ------------------------------------------------------------------------------
# cybozu.com
Cybozu_Url_Base = 'https://****.cybozu.com'

Src_App_ID = [移行元のKintoneアプリID]
Src_API_Token = '[移行元のKintoneアプリのAPIトークン]'
Src_Fields = [
    'AAA',
    'BBB',
    'CCC',
    'DDD']

Dst_App_ID = [移行先のKintoneアプリID]
Dst_API_Token = '[移行先のKintoneアプリのAPIトークン]'
Dst_Fields = Src_Fields

Base_DateTime = datetime.datetime(2000, 1, 1, 0, 0, 0)

# ------------------------------------------------------------------------------
# Variables
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Function
# ------------------------------------------------------------------------------

def replicateRecords():
    """Get Cybozu Monitors"""
    logging.debug("==== Replicate Records ====")
    logging.debug("==== Get Source Records ====")
    source_records = requests.get(Cybozu_Url_Base + '/k/v1/records.json',
        headers = {
            'X-Cybozu-API-Token' : Src_API_Token,
            'Content-Type' : 'application/json; charset=UTF-8',
            'If-Modified-Since' : 'Thu, 01 Jun 1970 00:00:00 GMT'
        },
        data = json.dumps({
            'app': Src_App_ID,
            'query': '$id > 0 order by $id asc limit 500',
            'fields': ['$id'] + Src_Fields,
            'totalCount': 'true'
        })
    )
    source_records_json = source_records.json()['records']
    logging.debug("source_records_json:[%s]", json.dumps(source_records_json, ensure_ascii=False))
    logging.debug("====")
    for n, k in enumerate(sorted(source_records_json, key=lambda x:int(x[u'$id']['value']))):
        logging.debug("(%04d/%04d) Source Record | [%s] ",
            n + 1, len(source_records_json), json.dumps(k, ensure_ascii=False, sort_keys=True))
        logging.debug("==== Post Destination Record ====")
        record = {}
        for nn, dst_field in enumerate(Dst_Fields):
            record[dst_field.decode('utf-8')] = {
                "value": k[Src_Fields[nn].decode('utf-8')]['value']
            }
        dt = Base_DateTime + datetime.timedelta(minutes=n)
        dt_str = "{0:%Y-%m-%dT%H:%M:%SZ}".format(dt)
        record['作成日時'.decode('utf-8')] = {
            "value": dt_str.decode('utf-8')
        }
        record['更新日時'.decode('utf-8')] = {
            "value": dt_str.decode('utf-8')
        }
        logging.debug("(%04d/%04d) Destination Record | [%s] ",
            n + 1, len(source_records_json),
            json.dumps(record, ensure_ascii=False))
        resp = requests.post(Cybozu_Url_Base + "/k/v1/record.json",
            headers = {
                'X-Cybozu-API-Token' : Dst_API_Token,
                'Content-Type' : 'application/json; charset=UTF-8',
                'If-Modified-Since' : 'Thu, 01 Jun 1970 00:00:00 GMT'
            },
            json = {
                'app': Dst_App_ID,
                'record': record
            }
        )
        logging.debug("resp:[%s]", resp)

# ------------------------------------------------------------------------------
# Program Start
# ------------------------------------------------------------------------------
if __name__ == '__main__':

    replicateRecords()

# ------------------------------------------------------------------------------
# Program End
# ------------------------------------------------------------------------------

logging.debug("<<<<<<<< %s End >>>>>>>>", __file__)

# ---1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----

```

1. 定数定義
    * `Cybozu_Url_Base` : ※任意 (ex : https://****.cybozu.com)
    * `Src_App_ID` : [移行元のKintoneアプリID]
    * `Src_API_Token` : [移行元のKintoneアプリのAPIトークン]
    * `Src_Fields` : ※移行元のKintoneアプリのレコードの各フィールドコードのリスト
    * `Dst_App_ID` : [移行先のKintoneアプリID]
    * `Dst_API_Token` : [移行先のKintoneアプリのAPIトークン]
    * `Dst_Fields` : ※移行先のKintoneアプリのレコードの各フィールドコードのリスト
1. 注意事項
    * 今回の Python スクリプトでは、2000/01/01 00:00 から１分ずつ追加した作成日時を設定しています。
        * 69行目 : `Base_DateTime = datetime.datetime(2000, 1, 1, 0, 0, 0)`
        * 108行目 : `dt = Base_DateTime + datetime.timedelta(minutes=n)`
        * 109行目 : `dt_str = "{0:%Y-%m-%dT%H:%M:%SZ}".format(dt)`
    * レコード番号の制御はしていません。
    * Src_Fields と Dst_Fields の順番は合わせる必要があります。

# ９９．ハマりポイント

* ハマりポイントというか、Kintone の仕様ですね。
<br><br>
* <b><font color="red">作成日時は、分単位でしか入力できない。</font></b>
    * [kintone REST APIの共通仕様 – cybozu developer network](https://developer.cybozu.io/hc/ja/articles/201941754-kintone-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98)
    * Kintone の Rest API の仕様みたいです。
<br><br>
* <b><font color="red">アプリのAPIトークンの設定において、アプリ管理権限の設定が必要。</font></b>
    * [レコードの登録（POST） – cybozu developer network](https://developer.cybozu.io/hc/ja/articles/202166160)
    * Kintone の Rest API の仕様みたいで、以下のフィールドを登録する場合は必要とのこと。
        * 作成者
        * 更新者
        * 作成日時
        * 更新日時

# ＸＸ．まとめ

作成日時を変更したい時もありますよね。

ということで、参考になれば♪

🙇‍♂️🙇‍♂️🙇‍♂️