今まで GAS でトーク Bot を動かしてトーク履歴を残したり、健康調査をする Bot を作ってきました。
LINEWORKS BOT とのやり取りを Google スプレッドシートに残す
毎日の健康調査をする仕組みを BOT で作ってみたよ
SpreadSheet に情報が残ってるんだから自分はそれを見ればいいわけですが、他の人に見せるときにはそうはいきません。
Google Drive からダウンロードして Excel データに変換して添付して渡すとかするわけです。
でも、どうせなら一定期間分を定期的にログデータとして csv で保管しといた方がいいのではと思ったわけですよ。
そこで、SpreadSheet を csv に変換し、Drive に保存する方法を調べてみました。
SpreadSheet を csv するには
以下の 3STEP で実現します。
- SpreadSheet のデータを読み込んで string にする
- string データを csv 形式の blob にする
- blob データを Google Drive に書き込む
blob は GAS 独自のオブジェクトで、ファイル名と MIME タイプの指定がついています。
Google Drive などの Google API を利用してファイルをやりとりするときによく使います。
JavaScript の Blob とは似ていますが違うものなので注意です。(`・ω・´)
SpreadSheet のデータを読み込んで string にする
csv データはカンマで区切られた一行の文字列です。
Comma-Separated Values (カンマ・セパレイテッド・バリューズ) の略ですね。
なので、SpreadSheet のデータを読み込んだら列の値ごとに ,
(カンマ) を入れて、行が変わるときは \r\n
(改行コード) を入れていきます。
function loadData() {
const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
let csv = '';
for(let i = 0; i < data.length; i++) {
csv += data[i].join(',') + "\r\n";
}
return csv;
}
これで csv っぽい String が作成できました。
string データを csv 形式の blob にする
次に、先ほど作成した String データを元に blob データを作ります。
function createBlob(csv) {
const fileName = 'テスト.csv'
const contentType = 'text/csv';
const charset = 'utf-8';
const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(csv, charset);
return blob;
}
csv 形式で保存するため、fileName の最後には必ず拡張子の .csv
をつけます。
contentType には text/csv
を指定します。
blob! blob!(*‘∀‘)
blob データを Google Drive に書き込む
blob データができたら、あとは Google Drive に書き込むだけですね~♪
これは Drive API を使えば簡単にできます。
function writeDrive(blob) {
const folderId = 'folderIdxxxyyyzzz';
const drive = DriveApp.getFolderById(folderId);
drive.createFile(blob);
}
Drive の folderId は予め調べておきましょう。
Google Drive の保存したいフォルダをブラウザで開くと、URL の最後が folderId になっています。
プログラムを実行!
では、今までのプログラムをすべてまとめて実行してみましょう!
function createCsv() {
const csv = loadData();
const blob = createBlob(csv);
writeDrive(blob);
}
はい!Drive 上に csv データが作成されましたね!
完成~!(*‘∀‘)
コード全体
function createCsv() {
const csv = loadData();
const blob = createBlob(csv);
writeDrive(blob);
}
function loadData() {
const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
let csv = '';
for(let i = 0; i < data.length; i++) {
csv += data[i].join(',') + "\r\n";
}
return csv;
}
function createBlob(csv) {
const fileName = 'テスト.csv'
const contentType = 'text/csv';
const charset = 'utf-8';
const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(csv, charset);
return blob;
}
function writeDrive(blob) {
const folderId = 'folderIdxxxyyyzzz';
const drive = DriveApp.getFolderById(folderId);
drive.createFile(blob);
}
おわりに
ここまでお付き合いいただきありがとうございました。
ふっふっふ。
実は csv データを作れるようになったら、やりたいことがあるのですよ。
前の記事でも書きましたが、LINEWORKS のトーク Bot がファイルの送受信に対応になったので、定期的に Bot に csv を送信してもらうのです!
【LINEWORKS API】新機能!BOT でファイルを送受信!
なので、次回は csv をトーク Bot に送信させてみたいと思います!
楽しみだな~♪
ではまた!(^^)/
参考にさせていただきましたm(_ _)m
スプレッドシートのデータをGASを使って1クリックでCSVに吐き出すものを作る。
GAS の Blob とファイル変換まとめ