本サイトはアフィリエイト広告(A8.net/もしもアフィリエイト/アクセストレード等)を利用しています
CSVインポートをGASで自動化する3手順
📂 スプレッドシート

CSVインポートをGASで自動化する3手順

📅 ⏱ 読了 約6分 ✍️ 凛

💡 本記事には広告(アフィリエイトリンク)が含まれる場合があります。

こんにちは、凛です。看護師として記録の正確さを叩き込まれてきた私でも、毎朝ダウンロードしたCSVをスプレッドシートに貼り付ける作業では、桁ズレや文字化けで何度もやり直してきました。とくに夜勤明けのぼんやりした頭では、単純なコピペほどミスが出るものです。

先に答えから:この4つで毎朝のコピペは消えます

回りくどい前置きは抜きにして、完成形からお見せします。CSVの自動取り込みは「取得→読み込み→貼り付け」の3関数と、それをつなぐ1関数で完結します。

まず、Driveのフォルダから最新のCSVを拾う関数。

// 指定フォルダから最新CSVを取得する疑似コード
function getLatestCsv(folderId) {
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFilesByType(MimeType.CSV);
  let latest = null;
  while (files.hasNext()) {
    const f = files.next();
    if (!latest || f.getLastUpdated() > latest.getLastUpdated()) {
      latest = f;
    }
  }
  return latest; // 最新のCSVファイル
}

次に、文字コードを指定してテキストとして読み込む関数。

// 文字コードを指定して読み込む疑似コード
function readCsv(file) {
  const blob = file.getBlob();
  const text = blob.getDataAsString('Shift_JIS'); // UTF-8なら 'UTF-8'
  const rows = Utilities.parseCsv(text);         // TSVなら parseCsv(text, '\t')
  return rows;
}

そして、シートに一括で貼り付ける関数。

// シートに一括貼り付けする疑似コード
function writeToSheet(rows, sheetName) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);
  sheet.clearContents();                          // 既存データを消す
  if (rows.length === 0) return;
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}

最後に、この3つをつなぐメイン関数です。

function importDailyCsv() {
  const file = getLatestCsv('フォルダIDをここに');
  const rows = readCsv(file);
  writeToSheet(rows, '取込データ');
}

importDailyCsv をGASエディタの「トリガー」から 毎朝6時に時間主導で実行 に設定すれば、子どもを起こす前にデータは入っている、という状態が作れます。運用としては、Google Drive上の特定フォルダに毎回CSVを保存するだけ。私はこれで、毎朝10〜15分かけていた貼り付け作業がゼロになりました。

ここから先は「なぜこう書いているのか」を順番に説明していきます。理由が分かっていると、自分のCSVに合わせて調整するときに迷いません。

なぜこう書くのか

ファイル名ではなく「最新ファイル」を拾う理由

getLatestCsv がファイル名指定ではなくフォルダ内の最新ファイルを探しているのは、ファイル名のタイプミスで止まる事故を防ぐためです。ダウンロードしたCSVの名前は日付やら連番やらで毎回微妙に変わりますよね。名前でピンポイントに探す設計にすると、その揺れのたびにスクリプトが空振りします。「そのフォルダにある一番新しいCSV」というルールにしておけば、保存さえすれば拾ってくれます。

フォルダIDは、Google Driveでフォルダをブラウザで開いたときのURLに含まれています。/folders/ の後ろの文字列がそれです。ここは間違えやすいので、最初に落ち着いて確認しておいてください。

もうひとつ、夜勤明けでも落ち着いて対処できるように、ファイルが見つからなかったときのエラー処理もセットで書いておくことを強くおすすめします。if (!latest) throw new Error('CSVが見つかりません'); の一行を足すだけです。実は私、これをやらずに運用していた時期に、CSVのアップロードを忘れてもGASが黙って終了してしまい、翌日になって気づいたことがありました。エラー処理は書くときこそ手間に感じますが、あとで絶対に助かります。

文字コードをわざわざ指定している理由

日本語CSVのつまずきポイントは、だいたい 文字コード区切り文字 です。銀行系・会計系のCSVはShift_JIS(CP932)が多く、海外SaaSはUTF-8が主流。タブ区切り(TSV)のファイルなら parseCsv の第2引数に '\t' を指定します。だから readCsv では getDataAsString('Shift_JIS') と明示しているわけです。

「文字化けしたら最初に疑うのは文字コード」。これだけ覚えておけば、9割のトラブルはサクッと解決します。私は楽天の売上CSVで最初にこれにハマりました。サイトによって文字コードが違うので、初めて使うサービスのCSVは必ず確認を。よく使うサービス別の文字コードをメモしておくと、次に別サービスのCSVを扱うときにすぐ調べられて便利です。

1セルずつ書かず、クリアしてから一括で貼る理由

writeToSheet の設計思想は「1セルずつ書かない」こと。ループで1セルずつ書くと遅いうえに、行数が増えるとタイムアウトします。2次元配列にして一括 setValues が鉄則です。範囲指定は (開始行, 開始列, 行数, 列数) の順で、配列の行数と列数をそのまま渡すと覚えれば迷いません。

貼る前に clearContents() で既存データを消しているのにも理由があります。前回分が残っていると、行数の違いで古いデータが混ざるんです。今日の取り込みが80行、昨日が100行だったら、下の20行は昨日の残骸。これに気づかず集計すると、静かに数字が狂います。

なお clearContents はデータだけを消して書式は残します。色やフォントを設定してある場合でも書式が消えないので安心してください。

ハマりどころ3つ

理屈が分かったところで、実際に運用してよくハマる場所を3つ。事前に知っておくと回避できます。

ファイルが見つからないエラー

DriveApp.getFolderById でのフォルダID貼り間違いが定番です。DriveのURLの /folders/ の後ろにある文字列がIDなので、URLをよく見て確認してください。フォルダIDが正しいのにエラーが出る場合は、GASプロジェクトがそのフォルダにアクセスする権限を持っているかを確認します。GAS初回実行時に「Driveへのアクセスを許可しますか」と聞かれるので、必ず「許可する」を押してください。フォルダの共有設定でGASが閲覧できない状態になっていることもあるので、権限まわりはあわせてチェックを。

行数と列数が合わずエラーになる

setValues は渡した配列の全行が同じ列数でないとエラーになります。CSVのデータに空行や列数の違う行が含まれている場合は、事前のフィルタリングが必要です。

// 空行を除外する例
const cleanRows = rows.filter(row => row.some(cell => cell !== ''));

CSVの最終行に改行コードだけの空行が含まれているケースは本当によくあります。このフィルタリングを一行入れておくだけで、大半のエラーが消えます。

clearContents のつもりが clear で書式まで消える

clearContents はデータのみを消しますが、clear だと書式(色・フォント・罫線など)も一緒に消えます。書式を保持したいなら必ず clearContents を。正直に白状すると、私は最初に clear() を使ってしまい、丁寧に設定した色分けが全部消えて悲しい思いをしました。ヘッダー行の書式を残したい場合は、clearContents のあとにヘッダー行を再設定するか、最初から2行目以降だけをクリアする範囲指定にするとよいです。

育てていく楽しみ

基本形が動いたら、小さな工夫を足していけます。取り込み後に SpreadsheetApp.flush() を呼んで反映を待つ、実行ログを別シートに記録して失敗した日を一目で確認できるようにする、Gmail通知で「◯行取り込みました」とスマホに届ける——このあたりを足していくと、自分専用の業務アシスタントに育っていきます。毎朝取り込んだ件数がGmailに届く仕組みは特におすすめで、「ちゃんと動いているか」の確認が一目でできて安心です。

この仕組みが特に効くのは、毎日同じCSVをダウンロードして貼り付ける定型作業をしている人、複数のCSVを別々のシートに振り分けている人、入力ミスが心配で毎回ダブルチェックしている人、銀行・会計ソフト・ECサイトなど複数の管理画面からCSVを取得している人です。GASはこうした繰り返し作業の自動化がいちばん得意なんです。

おわりに

CSVインポートは「取得 → 読み込み → 貼り付け」の3手順に分けて考えると、一気にシンプルになります。Driveの最新ファイルを拾う設計でファイル名ミスを防ぎ、文字コードと区切りは最初に決め、clearContents + setValues でまるっと入れ替える。骨組みはこれだけです。

最初の設定に1〜2時間かかっても、それが毎日の10分を自動化するなら、1ヶ月で5時間以上の節約になります。副業をしているなら、その時間を記事執筆や商品リサーチに回せますよね。一度仕組みを作ってしまえば、あとはCSVをDriveのフォルダに放り込むだけ。この「放り込むだけ」の状態が、作業効率を大きく変えてくれます。

毎日のコピペが消えると、夜勤明けのコーヒー時間が少しだけ長くなります。まずは自分のよく使うCSV1種類から、小さく始めてみてくださいね。

関連記事


この記事を書いた人:凛

2児2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。


掲載コードは構文・API仕様・ロジックを確認して載せています。フォルダIDやシート名はご自身の環境に置き換えてお使いください。