kintoneのレコード追加用のcsvファイル作成をGoで作ってみました
こんにちは。サイボウズ株式会社 開発本部 People Experienceチーム コネクト支援チームの貴島(@jnkykn)です。普段、担当業務のタスク管理にkintoneを利用していて、定型パターンのタスクを一式レコード登録する機会があります。通常は、過去の類似プロジェクトのタスクレコードを参考に、ポチポチとタスクを登録しているのですが、これを効率化したくなりました。Excelで対象レコードの元データを作って読み込ませると効率的なのですが、慣れているExcelで出力する以外の方法でレコード登録用の処理を作りたいと思いました。最近、「Go Connect #0」「Go Connect #1」など、会場提供の機会が増えていて気になっている、Goに入門することにしました!💪
定型タスクレコードを一括登録したい
業務の中で、いつも決まったパターンのものってありますよね。私の担当業務の中にも、定型タスクがあります。kintoneのタスク管理アプリに登録するときに、「毎度同じことをしている気がする!効率化したい!」とモヤモヤしていました。今回、Go言語入門を兼ねて、効率化チャレンジをしました。
Excelで作っても良いのだけど
kintoneで既存の対象レコードを絞り込んでCSVファイル出力したものをもとに、ファイル読み込み機能で複数のレコードを一括登録することができます。Excelなら、日付やタイトルなどを置換して、サッと目的のタスク登録データが作れます。一旦は、Excelで置換して新しいタスク用のCSVを作ってレコード登録したのですが、このためにコードを書けば良い練習になるなと思いました。いつもの自分のパターンだと、なにかツールを作ったりする際には、その時点で一番利用している言語や開発環境を使います。が、最近「試して理解Linuxのしくみ」の学習でサンプルを触った、Go言語で書くと良いのでは?と思いました。
GoはCと似ているところがある~!
まず、CLIで実行するので、コマンドライン引数が使えると良いなと思いました。調べてみると、os.Argsで受け取れることがわかりました。C言語と同様に、コマンドライン引数の配列の先頭には入力コマンドそのものが入り、スペース区切りで以降の配列に格納されるんですね。今回は、イベント名、イベントURL、開催日付、置換結果のCSV保存先のファイル名を渡すことにします。型が異なる変数を組み合わせた文字列の生成に、sprintfが使えるところも、C言語に似ていて理解しやすく感じました。
func getArgs()(title, connpass, eventdate, preparelimit, postproc, resultpath string, err error){
// get args
if(len(os.Args) != 5){
err = errors.New("パラメータに誤りがあります。\nUsage:\ngo run createCSV.go [event title] [connpass url] [event date] [result path]")
return title, connpass, eventdate, preparelimit, postproc, resultpath, err
}
// title
title = os.Args[1]
// url
connpass = os.Args[2]
// eventdate
date := strings.Split(os.Args[3], "/")
year := date[0]
month := date[1]
day :=date[2]
eventdate = os.Args[3]
// result path(output)
resultpath = os.Args[4]
// limit date for prepare
var preDate int
preDate, _ = strconv.Atoi(day)
preDate -=4
preparelimit = fmt.Sprintf("%s/%s/%d", year, month, preDate)
var postDate, _ = time.Parse("2006/01/02", os.Args[3])
y, m, d := postDate.AddDate(0,0,5).Date()
postproc = fmt.Sprintf("%d/%d/%d", y, m, d)
return title, connpass, eventdate, preparelimit,postproc,resultpath,err
}
関数に分けたい
最初は、関数の呼び出し方がわからず、main関数に処理を追加していったのですが、長くなると読みにくい上に修正もしにくくなると思い、コマンドラインパラメータ読み込み、元のCSV読み込み、文字列置換、CSV書き出しの関数に分けました。
func main() {
// get Args parameters
title, connpass, eventdate, preparelimit, postproc, resultpath, err := getArgs()
if (err != nil){
fmt.Println(err)
return
}
fmt.Printf("\n=== パラメータ ===\ntitle:%s\nconnpass:%s\ndate:%s\nprepare:%s\npostProc:%s\nresult:%s\n",
title,connpass,eventdate,preparelimit,postproc, resultpath)
// get source csv data
str := getSourceCSV()
// replace parameters
str = setParameters(str, title, connpass, eventdate, preparelimit, postproc)
// csv書き出し
createNewTaskCSV(str, resultpath)
}
エラー処理を追加してみた
パラメータが不足したり、多すぎたらUsageを出力して終了するようにしたくなったので、エラー処理を追加しました。エラーが発生したら、以降の処理は実行せずにmainに戻ります。mainでは関数でエラーが発生したら、メセージを表示して終了し、正常であれば以降の処理に進みます。
正しいパラメータを指定したとき
$ go run createCSV.go "Cybozu Frontend Monthly #49" https://cybozu.connpass.com/event/324896/ 2024/07/30 20240730
=== パラメータ ===
title:Cybozu Frontend Monthly #49
connpass:https://cybozu.connpass.com/event/324896/
date:2024/07/30
prepare:2024/07/26
postProc:2024/8/4
result:20240730
write 978 bytes
パラメータが不足しているとき
$ go run createCSV.go "Cybozu Frontend Monthly #49" https://cybozu.connpass.com/event/324896/ 2024/07/30
パラメータに誤りがあります。
Usage:
go run createCSV.go [event title] [connpass url] [event date] [result path]
まとめ
昨日から今日にかけて、いろいろ調べながら作ってなんとか形になりました。ソースは、こちらにあります。実際に使いたい機能を考えると「これをやるためには、どうしたらよいか?」を調べて実装できるので、こういうネタをどんどん個人学習の機会にしていきます。これからも精進して、Goでサッとなにかを作れるようになりたいと思います💪
参考リンク
Go言語について
コマンドライン引数の扱い
ファイルI/O
日付処理
文字列置換
関数の戻り値
エラー処理
kintone