Excelの表からRedmineのチケットを作るには、CSVに書き出し、取り込み画面で各列とチケット項目を対応付けます。
CSVを読み込めたことと、意図どおりのチケットが作られたことは別に確認します。
このページの例は、個人情報を含まない練習データで試せます。
練習ブック・CSV・コードをまとめたZIPをダウンロードして、元ファイルとは別のコピーで操作してください。
入力例:架空の2チケットをCSVにする
ZIPのpractice.csvはUTF-8のCSVです。
先頭行はsubject、description、start_date、due_date、parent_issue_idの5列です。
親チケットの説明にはカンマと改行を含め、2件目のparent_issue_idには1を指定しています。
これは既存チケットIDではなく、今回取り込む最初のチケットを示す指定です。
Excelで開き、データが5列、2件になっていることを確認します。
日本語が崩れる場合は「データ」→「テキストまたはCSVから」でUTF-8とカンマ区切りを指定して読み込みます。
保存はCSV UTF-8を選び、再度読み込んでカンマと改行が説明の中に残っているか確認します。
PythonでCSVの構造だけを事前確認する
Python 3を使う場合は、ZIPのフォルダで python validate_csv.py practice.csv を実行します。
正常ならrowsが2、column_countが5と表示されます。
この検査は通信を行わず、Redmineの権限やトラッカー、必須項目までは確認しません。
"""Local CSV structure/date check only. No network or Redmine calls."""
import csv,io,json,sys
from datetime import date
from pathlib import Path
FIELDS=['subject','description','start_date','due_date','parent_issue_id']
def validate(text):
reader=csv.DictReader(io.StringIO(text.lstrip('\ufeff')),strict=True)
if reader.fieldnames != FIELDS:
raise ValueError('Header must be: '+','.join(FIELDS))
rows=list(reader)
if not rows:raise ValueError('No data rows')
for i,r in enumerate(rows,1):
if None in r or any(v is None for v in r.values()):raise ValueError(f'Row {i}: column count mismatch')
if not r['subject'].strip():raise ValueError(f'Row {i}: empty subject')
dates=[]
for field in ['start_date','due_date']:
value=r[field]
if value and (len(value)!=10 or date.fromisoformat(value).isoformat()!=value):raise ValueError(f'Row {i}: use YYYY-MM-DD')
dates.append(date.fromisoformat(value) if value else None)
if all(dates) and dates[1]<dates[0]:raise ValueError(f'Row {i}: due date before start date')
parent=r['parent_issue_id']
if parent:
# This exercise intentionally allows only an earlier imported row.
if not parent.isdecimal() or not 1<=int(parent)<i:raise ValueError(f'Row {i}: parent must be an earlier import position')
return {'rows':len(rows),'column_count':len(FIELDS),'redmine_import_verified':False}
if __name__=='__main__':
try:print(json.dumps(validate(Path(sys.argv[1]).read_text('utf-8-sig')),ensure_ascii=False))
except (ValueError,csv.Error) as exc:sys.exit(str(exc))
Redmineで手動で対応付けを確認する
本番とは別の練習用プロジェクトを用意し、「チケット」のインポートからCSVを選びます。
文字コードはUTF-8、区切りはカンマ、引用符は二重引用符、日付形式はYYYY-MM-DDに合わせます。
プロジェクトと使用できるトラッカーを画面で選びます。
| CSV列 | 対応する項目 |
|---|---|
| subject | 題名 |
| description | 説明 |
| start_date | 開始日 |
| due_date | 期日 |
| parent_issue_id | 親チケット |
最終実行前に、プロジェクト、トラッカー、2件の題名、親子関係、通知設定を確認します。
練習用の通知先が確定していない場合は実行を止めます。
この記事の確認ではチケットの作成や通知送信を行っていません。
項目の対応付けは目視で確認します。
旧版で紹介していた自動選択ブックマークレットは、画面構造や表示名が違うと誤った列を選ぶため、現在の手順では使用しません。
確認結果と切り分け
| 条件 | 結果 |
|---|---|
| CSVにカンマ・改行が含まれる | 引用符の中に残り、チケットは2件として読み込まれる |
| 親番号1 | 今回の最初のチケットを参照する |
| 既存チケットを親にする場合 | #と既存IDを付ける指定。練習CSVには使っていない |
| 担当者を指定する場合 | 担当可能なユーザーのログイン名を確認して列を追加する |
| エラーになった | 作成済み件数と未作成の行を確認し、全件をそのまま再投入しない |
| 再実行したい | 新規作成なので同じCSVの重複投入に注意する |
取り込みを実行した場合は、新しいチケットの題名、説明の改行、日付、プロジェクト、親子関係を確認します。
一部が作成された状態なら、作成結果を記録してから未作成の行を整理します。
CSVの取り込みを通常の「元に戻す」で取り消せるとは考えず、練習プロジェクトの担当者と復旧方法を決めてから実行します。
公式仕様と、この検査の範囲
RedmineのCSV取り込みの公式説明に、列の対応付けと親チケット番号の指定方法があります。
現在の公式ミラーの取り込み実装でも新規チケットを生成する処理を確認しました。
実際の画面や利用環境のバージョンは別に確認が必要です。
2026年10月2日に、練習ブックの数式をArtifact Toolで計算し、CSVをPythonで検証しました。
Excelの実画面での操作、VBAのコンパイル・実行、Redmineへの実際の取り込みは未検証です。
関連記事・旧実装の参考資料
関連記事は用途の違いを確認して参照してください。
練習用ZIPのデータと、記事中のセル番地・コードをそろえています。





