GASでGoogle Driveに取り込んだCSVファイルをスプレッドシートに自動転記する(文字化けの解消も含む)
経緯
社内で使用しているツールからCSVファイルをダウンロード、それをスプレッドシートに張り付け。これを手動で毎朝、5シート以上行っていました。今回はこれを自動化していきます。
プロセス
実装にあたり必要なプロセスは以下の通りです。
- csvファイルをPower automateで自動取得し
- パソコン版Google Driveの指定のフォルダに格納
- 特定の時間にcsvファイルをスプレッドシートに自動転記←今回はこの部分
1.2はノーコードで実装可能です。今回は3の部分を実装していきます。
では解説していきます。
ファイルの取得
function CSVtoSS() {
// 「csv」フォルダを取得
const folder = DriveApp.getFolderById('フォルダのID');
const files = folder.getFiles();
// アクティブなスプレッドシートを取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('任意のシート名');
// 前日の内容をクリアする
sheet.clear();
まずはフォルダのIDを取得しましょう。
パソコン版GoogleDriveのローカルファイルにcsvを格納すると、自動的にクラウドにも共有されるので、そのIDを取得します。
'フォルダのID'は以下の画像のd/ ~ /editまでの部分です。
今回のシートは毎日更新のため、上書きが必要です。
その処理をシートをクリアにすることで対応しました。
// 前日の内容をクリアする
sheet.clear();
実際のファイルの処理
while (files.hasNext()) {
const file = files.next();
const fileId = file.getId();
// CSVファイルを取得
const blob = DriveApp.getFileById(fileId).getBlob();
// CSVデータをUTF-8エンコーディングで読み込む
const csv = blob.getDataAsString('MS932');
// CSVデータが空でないか確認
if (csv.trim() === "") {
// Logger.log("CSVデータが空です。"); // ログ出力が不要であればコメントアウト
continue;
}
hasNext()メソッドはまだ読み込むべきファイルがあるかどうかを確認します。
files.next();反復処理でまだ取り出していないファイルを取り出す処理
blobはファイル名と拡張子が付いたファイルと何かに書かれていましたが、まだうまく理解できていません。Google Drive を利用してファイルをやりとりするときによく使うようです。
// CSVデータをUTF-8エンコーディングで読み込む
const csv = blob.getDataAsString('MS932');
文字化けの処理はここでします。
検索すると Shift-JIS
で文字コードを指定する方法がたくさん出てきますが、それではうまくいきませんでした。MS932
こちらで指定すると文字化けが出ません。
シートへの転記部分
const values = Utilities.parseCsv(csv);
if (values.length > 0) {
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
}
}
const values = Utilities.parseCsv(csv);
CSV形式の文字列を解析し、2次元の配列に変換してシートに貼り付けます。
この部分がないとうまくスプシに転記されません。
if (values.length > 0) {
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
指定された範囲にセットする部分
コード全文
function rslcsv() {
// 「rsl_csv」フォルダを取得
const folder = DriveApp.getFolderById('フォルダのID');
const files = folder.getFiles();
// アクティブなスプレッドシートを取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('任意のシート');
// シートが存在する場合、クリアする
sheet.clear();
while (files.hasNext()) {
const file = files.next();
const fileId = file.getId();
// CSVファイルを取得
const blob = DriveApp.getFileById(fileId).getBlob();
// CSVデータをUTF-8エンコーディングで読み込む
const csv = blob.getDataAsString('MS932');
// CSVデータが空でないか確認
if (csv.trim() === "") {
// Logger.log("CSVデータが空です。"); // ログ出力が不要であればコメントアウト
continue;
}
const values = Utilities.parseCsv(csv);
if (values.length > 0) {
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
}
}
トリガー設定
最後に、毎朝いつもの時間に自動で行われるようにトリガーの設定を行います。
これで設定は完了です。
まとめ
データの自動取得は応用が利くので、これをベースにクライアント企業のDX化に取り組んでいくところです。
最後までご覧いただきありがとうございました。
Discussion