1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

レバテックプラットフォームの作業報告をExcelから自動入力する(JavaScript + Node.js)

1
Posted at

レバテックプラットフォームの作業報告をExcelから自動入力する(JavaScript + Node.js)

image.png

はじめに

レバテックプラットフォームの作業報告入力、毎月地味に面倒じゃないですか?
私の今の現場ではExCelで勤怠管理をしてます。

  • Excelで勤怠は管理している
  • でもWeb画面に手入力が必要
  • コピペも微妙に手間

ということで
Excel → 自動変換 → ブラウザで一括入力
までを半自動化しました。
(簡易的です、お許しください)


前提

一応、私の環境です。

OS:ubuntu 24.04
ブラウザ:FireFox

Windowsの場合はちょっと違うかも


全体構成

今回やることはシンプルです。

  1. Excelを読み込む(Node.js)
  2. JSON形式に変換
  3. ブラウザでJavaScriptを実行して自動入力

ちなみに、Excelのフォーマットによって調整は必要だと思います。
今回は私の現場で使用しているフォーマットをベースにしてます。
image.png


完成イメージ

  • Excelを置く
  • コマンド1発
  • ブラウザでスクリプト実行

→ 作業時間が一括入力される


① Excel → JSON変換スクリプト

フォルダ構成

~/Documents/levtech_auto/
├── convert.js
└── excelFile/
    └── (Excelファイル)

convert.js

const XLSX = require("xlsx");
const fs = require("fs");
const path = require("path");

// Excel格納フォルダ
const DIR = "/home/(ユーザー)/Documents/levtech_auto/excelFile";

// .xlsxファイルを探す
const files = fs.readdirSync(DIR).filter(f => f.endsWith(".xlsx"));

if (files.length === 0) {
  console.error("❌ Excelファイルが見つかりません");
  process.exit(1);
}

if (files.length > 1) {
  console.warn("⚠️ 複数のExcelがあります。先頭を使用:", files[0]);
}

const FILE_PATH = path.join(DIR, files[0]);
console.log("📄 使用ファイル:", FILE_PATH);

const wb = XLSX.readFile(FILE_PATH);
const sheet = wb.Sheets[wb.SheetNames[0]];
const rows = XLSX.utils.sheet_to_json(sheet, { header: 1 });

function pad(n) {
  return String(n).padStart(2, "0");
}

function isNumber(v) {
  return typeof v === "number" && !isNaN(v);
}

function toTime(h, m) {
  if (!isNumber(h) || !isNumber(m)) return null;
  return `${pad(h)}:${pad(m)}`;
}

function toBreak(h, m) {
  if (!isNumber(h) || !isNumber(m)) return "0:00";
  return `${pad(h)}:${pad(m)}`;
}

const result = {};

rows.forEach(row => {
  if (!row || row.length < 7) return;

  const day = row[1];
  const startH = row[3];
  const startM = row[4];
  const endH = row[5];
  const endM = row[6];
  const restH = row[9];
  const restM = row[10];

  // 数値データのみ採用(ヘッダ除外)
  if (!isNumber(day) || !isNumber(startH) || !isNumber(endH)) return;

  const date = new Date((day - 25569) * 86400 * 1000);
  const mm = pad(date.getMonth() + 1);
  const dd = pad(date.getDate());

  const key = `${mm}/${dd}`;

  result[key] = {
    start: toTime(startH, startM),
    end: toTime(endH, endM),
    break: toBreak(restH, restM),
  };
});

fs.writeFileSync("output.js", "const data = " + JSON.stringify(result, null, 2));

console.log("✅ 完了 件数:", Object.keys(result).length);

convert.js実行

node convert.js

👉 output.js が生成される
output.jsの中身はこんな感じのはず(長いので冒頭のみ)

const data = {
  "03/02": {
    "start": "10:00",
    "end": "22:30",
    "break": "02:00",
  },
  "03/03": {
    "start": "10:00",
    "end": "21:30",
    "break": "01:00",
  },

② ブラウザで自動入力

レバテックの作業報告画面を開いて、
DevToolsのコンソールにoutput.jsの中身を貼り付けてEnter
image.png

続いて、同じくDevToolsのコンソールに以下のスクリプトを入力し、Enter


自動入力スクリプト

const $ = window.jQuery;

$('table tbody tr').each(function() {
  const row = $(this);

  // 日付取得
  const dateText = row.find('td').first().text().trim();
  const match = dateText.match(/\d{2}\/\d{2}/);
  if (!match) return;

  const key = match[0];
  const d = data[key];
  if (!d) return;

  // 各入力欄
  const start = row.find('input[name$="[start_time]"]');
  const end = row.find('input[name$="[end_time]"]');
  const relax = row.find('input[name$="[relax_time]"]');

  // 値セット
  start.val(d.start);
  end.val(d.end);
  relax.val(d.break);

  // ★これがレバテックのトリガー
  relax.trigger('focusout');
});

Enterで作業時間が反映されるはず。


まとめ

まあ、お気づきかと思いますが、ChatGPTの監修です。
今回は私の使用してる勤怠管理Excelをベースにしてますので、そのままでは使用できないと思います。

この記事をChatGPTに読ませて、
似たようなの作って〜〜ってお願いすればささっと作ってくれるはず。


おわりに

ちょっとしたスクリプトですが、
面倒な作業を少しでも減らせれば。。。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?