今回はなんだかんだ言ってExcelのテンプレート(雛形)も使うんだよ
というお仕事に役立つカスタマイズ・・・かも知れません。
※書式が消えてしまうということが分かりました💦
予め作っておいたExcelファイルにkintoneのフィールドの値を書き込んでダウンロードするアプリです。
アプリの準備
アプリはファイル置き場のアプリと、Excelに書き込むアプリ2種類作成します。
ファイル置き場アプリ
このアプリは、フィールドを準備するだけです。特にカスタマイズはしません。
フィールド種類 | フィールドコード | 備考 |
---|---|---|
添付ファイル | 添付ファイル | |
文字列(1行) | 説明 |
テンプレートとなるExcelファイルを保存しておきましょう。ファイル名はなんでもOKです。
今回は、A1セルになにか入力したらC2セルに「僕の名前は[A1の値]です」となるようなExcelファイルを作りました。
※A1になにか値を入力している状態で保存しておきましょう。
Excelに書き込むアプリ
フィールド種類 | フィールドコード | 備考 |
---|---|---|
スペース | spBtn | |
文字列(1行) | 名前 | |
文字列(1行) | 出力ファイル名 | |
ルックアップ | テンプレート | ファイル置き場からレコード番号取得 |
文字列(1行) | テンプレートの説明 | (ルックアップで説明フィールドを取得) |
JavaScript
Excelに書き込むアプリの方のカスタマイズをします。
こちらのライブラリを使用します。
ファイルダウンロードしつつ、sheetjsで書き換えたいセルを書き換えます。
↓ファイルダウンロードはこちらを参考に。
詳細、編集画面などお好きなイベントで使ってください。
// スペースフィールドにボタン設置
const sp = kintone.app.record.getSpaceElement("spBtn");
const btn = document.createElement("button");
btn.textContent = "ボタン";
sp.appendChild(btn);
// ボタンクリック
btn.addEventListener("click", async () => {
const fileKey = await kintone.api(
kintone.api.url("/k/v1/record.json", true),
"GET",
{
app: kintone.app.getLookupTargetAppId("テンプレート"),
id: event.record.テンプレート.value,
}
);
const url =
"https://{サブドメイン名}.cybozu.com/k/v1/file.json?fileKey=" +
fileKey.record.添付ファイル.value[0].fileKey;
// ファイルダウンロード
const req = new XMLHttpRequest();
req.open("GET", url);
req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
// SheetJS の公式ドキュメントのBrowser download fileを参考に
req.responseType = "arraybuffer";
req.onload = (e) => {
const data = new Uint8Array(req.response);
const workbook = XLSX.read(data, { type: "array" });
// Excelのセルを書き換える(
workbook.Sheets[workbook.SheetNames[0]].A1 = {
v: kintone.app.record.get().record.名前.value,
};
XLSX.writeFile(workbook, event.record.出力ファイル名.value);
};
req.send();
});
return event;
動作確認&まとめ
今回の場合、A1のセルに決め打ちで入力しているので、柔軟にやりたい場合は書き込み先のセルの指定など色々と工夫する必要がありそうです。