残業時間の集計を選択してひと月のおよその収入がわかるUserScriptを作りたい
ページのフォーマットは以下のような感じです。
1か月分(各月21日~20日)の出勤日があって、それぞれ横に残業時間を記してある。
時給(@800)を基に1か月の収入を知るものを作りたい。
@800 ← 時給
@134400 ← 定時(8H)までの収入
@21200 ← 残業代
@155600 ← 合計
//table:時給計算
01 [200923 wed]
1.0H
02 [200924 thu]
1.5H
03 [200925 fri]
2.0H
04 [200926 sat]
0H
05 [200928 mon]
1.0H
06 [200929 tue]
1.5H
07 [200930 wed]
0.5H
08 [201001 thu]
1.0H
09 [201002 fri]
2.0H
10 [201005 mon]
2.5H
11 [201006 tue]
3.0H
12 [201007 wed]
1.0H
13 [201008 thu]
1.0H
14 [201009 fri]
0.5H
15 [201012 mon]
2.0H
16 [201013 tue]
1.5H
17 [201014 wed]
1.5H
18 [201015 thu]
2.0H
19 [201016 fri]
1.0H
20 [201019 mon]
0H
21 [201020 tue]
0H
金額見積もり出勤日 | 21 | 日 |
残業時間 | 26.5 | 時間 |
時給 | 800 | 円 |
残業代 | 21200 | 円 |
基本給 | 134400 | 円 |
合計 | 155600 | 円 |
APIからcsvファイル形式で取得できるようになります
ああ、日付のところが無意味にリンクになるのを防ぎたかっただけでcsvにしたい気持ちはありません
csvにすればエクセルぶっ込んで計算出来ますけどエクセル立ち上げる必要が出てくるのがなぁ…と。
エクセル使える環境ならわざわざScrapboxで管理しないって
そもそも、スマホで書き込む事を前提としているのでtable記法はあまり使いたくない
上記の「取り扱い」というのは、やっぱしエクセルやらで計算する事を前提としての取り扱い?
UserScriptに取り込んで使うのが目的
コード記法でもいいし、ページの本文をAPIで取ってきて加工してもいいかも
難しくても書いてみよう…と言ってくれたので書いたのに「取り扱い」を前提に管理を改めろ…というのはどうかな?と。
そこのページの書式だと、
ほげほげ ふがふが 1h
のように行末が 整数値 + h で終わるというルールですが、それで良いのでしょうか
整数値なので、小数(1.5など)があるとマッチしません
hは固定値で、大文字のHだとマッチしません
時給の「800」や基本給の「134400」は定数値としてスクリプト中に埋め込んでも問題ないでしょうか
個人的に使うのであればそれで充分だと思います
汎用性を持たせるとなると、入力テキストなどに記述することになります
その分、書式チェックやデータチェックなどで処理が複雑になります
UserScriptでテキストの入力って可能なんですか?
できる!!
マジすか!倉下さんが出来たらいいのにとか言われてたので出来ないのか…と思ってたが出来るんだ😁
できるけど、「思ったのと違う」とか言われそうw
列挙するとこんな感じかな?
複雑なことをする場合は <dialog>
を使う
3. <input type='text'>
を挿入する
ほへ~。なんだかいろいろ出来るんですね。私UserScriptの
replace(/)
とか
replace(\d)
とかがよくわからないんですよね。あれってば一般的なjavascriptの参考書見てもわかるもの?Scrapbox独自の物?
JavaScriptの参考書に書かれているはずです
↑この2つを読めばだいたい分かると思います
勉強したいと思います
正規表現で残業時間の合計を求め、時給単価をかけ合わせ、通常勤務の給与を足す
ページの最後にいくらって出るようにする
というわけで、やっつけ
行末の数値(小数点を含む)+ h という記述を集計する仕様
なんと、table記法では動かなかった
時給は入力できるけど、たぶん決め打ちのほうが使い勝手がいい
script.js// 選択範囲の文字列から残業時間の数値のみを抽出し、
// 合計を計算して、選択範囲のすぐ下に追記する
scrapbox.PopupMenu.addButton({
title: 'WorkTime',
onClick: text => {
//const pay_per_hour = 800 ; // 時給
const pay_per_hour = prompt("時給単価");
if (isNaN(pay_per_hour) || pay_per_hour <= 0 || pay_per_hour > 99999999) {
console.error(`Invalid value of pay par hour: ${pay_per_hour}`);
return;
}
const work_day = text.split("\n").length - 1;
//const work_day = 21;
//let work_day = prompt("出勤日");
//(work_day < 21) ? work_day = 20 : work_day = 21;
//const basic_salary = 134400; // 基本給
const basic_salary = pay_per_hour * 8 * work_day ; // 基本給
// テキストの行末に時間の数値文字列が含まれるかを判定する
const existsTimeInt = (line) => line.match(/.*\d+\.?\d*|\.\d+h\s*$/i);
// 文字列から時間文字列の数値部分のみ取得する
const getTimeString = (line) => {
return line.replace(/.*\s(\d+\.?\d*|\.\d+)h\s*$/i, function() { return arguments[1] });
}
// 選択範囲の文字列から時間(H)を取得して合計を算出する
const t = text.split("\n")
.filter((line) => existsTimeInt(line))
.map((line) => getTimeString(line))
.map((line) => Number(line))
.reduce((x, y) => x + y);
// 表示用文字列の生成
return [
text,
"table:金額見積もり",
`\t出勤日\t${work_day}\t日`,
`\t残業時間\t${t}\t時間`,
`\t時給\t${pay_per_hour}\t円`,
`\t残業代\t${t*pay_per_hour}\t円`,
`\t基本給\t${basic_salary}\t円`,
`\t合計\t${t*pay_per_hour + basic_salary}\t円`,
].join('\n');
}
});
今週は忙しいので週末時間を作って確認します
いま
個人project内でチェックをしていますが、UserScriptのページを開くと重くて「応答なし」になる。
職場でやれば応答なしにはならない。スペックの問題か。
テストできました。裏でWindows10 Updateが動いてました。
ありがとうございました。
すみませーん!!今更ですが。こちら基本給が固定になってますが時給✕8時間✕日数=基本給なので固定でなく計算出来るようにしたいのですが、どこをイジったらいいんでしょうか?考えてみたけどわからなくて…。お願いします!
出勤日(日数)のデータをどこから取ってくるかですね
考えられるのは
1. 定数で決め打ち
2. promptから入力する
3. データの行数から算出する
とりあえず、3で実装してみました
あと、確認のため、出勤日も表示するようにしてみました