以前、researchmapに一括登録するためのcsvをエクセルからの変換で生成する方法についてのエントリ(リンク)を書いてましたが、Pythonのスクリプトとシェルスクリプトに分かれていたり、スクリプトを置く場所を気をつけないといけなかったり、Windowsの人とツールが共有できるか謎だったりしたので、ブラウザで動かせるようにJavascriptにしました。
ごく簡単な内容で、ポイントとしては、
- CSVの1行目はデータではなく識別コードを記載する(下記コードのfilePrefixの部分)
- すべてのデータを""で囲む
- アブストラクトのコピーも登録する場合、セル内で改行が発生する場合があるので、念のため改行コードをそろえるようにしておく
程度ですね。
1つのエクセルファイルに「rm_published_papers」(論文)や「 rm_presentations」(口頭発表)などのシートを設けておいて、それを全部読み込んで個別にCSV化(すべてのCSVを1つのzipファイルにまとめて出力)するという内容です。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>researchmap CSV 変換ツール</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.2/papaparse.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script> <style> body { font-family: sans-serif; padding: 2em; } h1 { font-size: 1.5em; margin-bottom: 1em; } input, button { margin-top: 1em; display: block; } </style> </head> <body> <h1>researchmap CSV 変換ツール</h1> <input type="file" id="excelFile" accept=".xlsx" /> <button onclick="handleConvert()">CSVへ変換(ZIP出力)</button> <p id="status"></p> <script> const sheetConfig = { rm_published_papers: "published_papers", rm_presentations: "presentations", rm_books_etc: "books_etc", rm_research_projects: "research_projects", rm_teaching_experience: "teaching_experience", rm_media_coverage: "media_coverage", rm_industrial_property_rights: "industrial_property_rights", rm_awards: "awards", rm_committee_memberships: "committee_memberships", rm_misc: "misc" }; function handleConvert() { const fileInput = document.getElementById('excelFile'); const status = document.getElementById('status'); const file = fileInput.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = async (e) => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: "array" }); const zip = new JSZip(); Object.entries(sheetConfig).forEach(([sheetName, filePrefix]) => { const sheet = workbook.Sheets[sheetName]; if (sheet) { const json = XLSX.utils.sheet_to_json(sheet, { defval: "", raw: false }); let csv = Papa.unparse(json, { quotes: true }); csv = csv.replace(/\r?\n/g, "\r\n"); // 改行コードをCRLFに統一 const content = `${filePrefix}\r\n${csv}`; zip.file(`${filePrefix}.csv`, content); } }); const blob = await zip.generateAsync({ type: "blob" }); saveAs(blob, "researchmap_csvs.zip"); status.textContent = "CSVファイルをZIPで出力しました。"; }; reader.readAsArrayBuffer(file); } </script> </body> </html>