シェルスクリプト、 Google Apps Script を使って「全角を 2 文字、半角を 1文字とカウントし、指定文字数ごとに区切り文字を挿入するスクリプト」を実装しました。
依頼を受けた時点では少なくとも過去分だけ対応すればよかったので、その時点で入力済みデータをぼく(開発側)のほうでシェルスクリプトで対応してしまっていました。さらに、未来のデータ入力については、「担当者がよしなに頑張ってくれるだろう」と
ぼくは何も考えていませんでした。笑
結局のところ、入力ミスを防ぐため、「データ入力時にも改行コードを自動的に挿入してあげてほしい」という話になったので、
あとから Google Apps Script で同様の処理をするツールを作ることになってしまったわけです。(;´Д`)
こんなことなら最初から GAS で対応しておけばよかった。笑
前段が長くなりましたが、本題です!(短い)
#!/bin/bash
if [ $# != 2 ]; then
echo "usage: $0 file_name char_max_length" 1>&2
exit 0
fi
dir=`dirname $1`
file_name=`basename $1`
temp_csv_file="temp_${file_name}"
char_max_length=$2
rm -f ${temp_csv_file}
cat "${dir}/${file_name}" | while read line
do
text=`echo $line | cut -d"," -f3|tr -d " "`
if [ "$description" ]; then
new_line=`echo ${line} | tr -d " "`
# text を指定文字数で分割してタブでつなげる
new_text=`echo "${text}" | fold -${char_max_length} | paste -s -d "\t" -`
# 一旦ファイルに書き出し
echo "${new_line}" | sed -e "s/${text}/${new_text}/g" >> ${temp_csv_file}
else
echo "${line}" >> ${temp_csv_file}
fi
done
# タブを \n に置換する
# 「\n」の文字列をつけるのが難しかったので苦肉の策
sed -i -e "s/\t/\\\n/g" ${temp_csv_file}
というわけで、内容重複しますが github のこのページにて公開していますのでご自由にお使い下さい。// attach "\n" string into each N charactors
var char_length = 20;
// Execute "onEdit()" after spread sheet has been changed.
function onEdit(e) {
var current_sheet = e.source.getActiveSheet();
var row = e.range.getRow();
var col = e.range.getColumn();
var cell_value = e.value;
var old_value = e.oldValue;
if (row !== 1 && col == 2) {
var range = current_sheet.getDataRange();
var text = "";
if (old_value !== "") {
var str_arr = splitStringsByLength(cell_value, char_length);
text = str_arr.join('\\n');
}
range.getCell(row, col + 1).setValue(text);
}
}
// Execute after clicked "Convert" button.
function convertAll() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var current_sheet = sheet.getActiveSheet();
var range = current_sheet.getRange(2, 2, current_sheet.getMaxRows() - 1);
var values = range.getValues();
var pasted_range = current_sheet.getRange(2, 3, current_sheet.getMaxRows() - 1);
for (var row in values) {
var orig_text = values[row][0];
var str_arr = splitStringsByLength(orig_text, char_length);
var text = str_arr.join('\\n');
pasted_range.getCell(parseInt(row, 10) + 1, 1).setValue(text);
}
}
function splitStringsByLength(text, length) {
var text_array = text.split('');
var count = 0;
var str = '';
var ret_text_array = [];
for (i = 0, l = text_array.length; i < l; i++) {
var n = escape(text_array[i]);
if (n.length < 4) {
count++;
} else {
count += 2;
}
if (count > length) {
ret_text_array.push(str);
count = 1;
str = '';
}
str += text.charAt(i);
if (i === text_array.length - 1) {
ret_text_array.push(str)
}
}
return ret_text_array;
}
mac に pip をインストールする
mac は標準で python が入っていますが、パッケージ管理の pip がインストールされていないので入れてみました。
2017/05/26 09:00
[GAS] Google Drive の特定フォルダ配下のフォルダ・ファイルの権限を一括で移譲する
Google Drive の特定フォルダ配下のファイル・フォルダの権限を一括で移譲するツールを Google Apps Script で作りました。
2018/11/10 15:54
[Windows] Ophcrack を使ってユーザーパスワードを解析する方法
家族で使っていた Windows7 のログインパスワードを忘れたため、Ophcrack を使って解析したときの記録です。
2017/09/30 21:00
[shell] フォルダ内にある大量の ZIP ファイルをまとめて解凍する
とある ZIP を解凍すると中に大量の ZIP が居たときに幸せになれるコマンドを紹介します
2018/06/19 23:45
[MySQL] データファイルから DB を復元する
先日 MySQL が再起動できなくなる問題が発生し、急遽データファイル(.frm, .ibd)から復元しました
2018/11/25 12:44