· シン · column  · 6 min read

コードは正しいのに動かない?日付の「型」に振り回されないためのトラブル対処法

GoogleスプレッドシートやGASでコードが正しいのに動かない原因は「型」の自動判定かも?見た目に騙されない対策と、6分の壁を越える高速化の鉄則を解説。

GoogleスプレッドシートやGASでコードが正しいのに動かない原因は「型」の自動判定かも?見た目に騙されない対策と、6分の壁を越える高速化の鉄則を解説。

こんにちは、e-Shikumi-Laboの シン です。 このブログでは、スプレッドシート&GAS、Chrome拡張機能をはじめとする自動化のTipsや、日々の現場での気づきを公開しています。

先日、現場のデータ処理中にExcel VBAで日付判定エラーが発生しました。 AIにコードを見せても「間違っていない」と言う。しかし動かない。 ウォッチウィンドウでデータを1つずつ確認したところ、ダウンロードしたマスタデータの日付列の型が、1列だけ「文字列型」になっていたのが原因でした。

見た目は全く同じ日付に見えるため、非常に気づきにくい罠です。 「GoogleスプレッドシートやGAS(Google Apps Script)なら、こうした問題は起きないのだろうか?」と思われるかもしれませんが、GASでも同様のことが起こります。


1. GASでも起きる「自動判定の罠」

GASでも、Excelと同様に自動判定の罠が存在します。 getValue() でセルから値を取得する際、スプレッドシート側で日付と認識されていれば「日付型(Dateオブジェクト)」になりますが、文字列と認識されていれば「文字列型(String)」として取得されてしまいます。

まさに**「見た目に騙されるな」**という世界で、画面上の表示が日付っぽく見えていても、内部の型が異なればその後の計算や判定でエラーになります。


2. 対策:後処理で型を明示的に設定する

データを取り込んだ後、処理を行う前に型を明確に設定するのが一番確実な対策です。たとえば、以下のようなアプローチがあります。

  • getDisplayValue() を使う:セルの見た目通りの文字列として一律で強制取得し、スプレッドシート側の自動判定を無効化する。

  • new Date() を使う:取得したデータを明示的に日付型(Dateオブジェクト)に固定してから処理を始める。


3. GAS特有の注意点:1つずつ処理すると時間制限にかかる

GASで対策する際、VBAの感覚でループ(For文)を使って1セルずつ型判定・変換を行うと、別の問題が発生します。 GASには「6分間の実行時間制限」があるため、セルへのアクセスを繰り返すと、数千件のデータでも処理が間に合わなくなります。

GAS的鉄則:「一括取得 ➔ 配列処理 ➔ 一括書込」

GASではセルを直接何度もいじらず、一度すべてのデータを配列(メモリ上)に吸い上げてから一括処理するのが基本です。

function safeDateProcessor() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  // 1. データを配列として一括取得
  const range = sheet.getRange(2, 1, lastRow - 1, 1); 
  const values = range.getValues(); 

  // 2. 配列(メモリ)上で高速判定&変換
  const processedValues = values.map(row => {
    let val = row[0];
    if (typeof val === 'string' && val.trim() !== '') {
      let parsed = new Date(val.trim());
      if (!isNaN(parsed.getTime())) return [parsed]; 
    }
    return [val]; 
  });

  // 3. 一括書き戻し
  range.setValues(processedValues);
}

配列処理にすることで、アクセス回数が最小限になり、処理時間を劇的に短縮できます。

まとめ:原因不明のエラーに遭遇したら

「コードは合っているはずなのに、なぜか動かない」 そんなときは、以下のステップでデータを疑ってみてください。

  1. データを出力してみる console.log()(または Logger.log())を使って、実際の値を出力して確認する。

  2. 型を見てみる 型を出力する関数(typeof など)を入れて、内部でどう認識されているかを確認する。

今回は日付のケースでしたが、この手のエラーは「数字」でも全く同じように起こります。(見た目は数値なのに、1つだけ文字列型になっていて計算や不一致が起きるなど)

システムからダウンロードしたデータを扱うときは、処理の前にまず「型を確認・明示する」。これだけで、原因不明のエラーで時間を溶かすリスクを大幅に減らすことができます。

Back to Blog

Related Posts

View All Posts »