「Exception: Cannot convert ‘xxx’ to Object」 が出る原因と対処法【GAS / JavaScript】

この記事の内容について、業務や開発でお困りの場合は個別に対応できます。

JavaScript や Google Apps Script(GAS)を書いていると、次のようなエラーに遭遇することがあります。

Exception: Cannot convert 'xxx' to Object

この記事では、このエラーがなぜ起きるのか、そしてどう直せばいいのかを、GAS で実際によくあるパターンに絞って整理します。
GAS 初学者〜実務でスプレッドシートや API を扱う方まで、再発防止を含めて理解できる内容です。


Exception: Cannot convert ‘xxx’ to Object とは何か

このエラーを一言で言うと、

「Object(オブジェクト)として扱えない値を、Object に変換しようとしている」

という意味です。

GAS や JavaScript では、

  • オブジェクト
  • 配列
  • JSON
  • null / undefined

の扱いを間違えると、「変換できない」という形でこの例外が発生します。


よくある原因①:Object に変換できない値を渡している

Object として扱うことを前提とした処理に、プリミティブ型を渡しているケースです。

例:Object.keys に文字列や数値を渡している

function sample() {
  const value = "test";
  const keys = Object.keys(value);
}

Object.keys() はオブジェクト専用です。
文字列や数値は Object として変換できず、エラーになります。

対処法

  • Object.keys / Object.values / Object.entries は 純粋なオブジェクトにのみ使う
  • 型を事前に確認する
function sample() {
  const value = { a: 1, b: 2 };
  const keys = Object.keys(value);
}

よくある原因②:null / undefined を Object として扱っている

GAS では null / undefined が混入したまま処理が進むことがよくあります。

例:戻り値が null の可能性を考慮していない

function sample() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("Sheet1");

  const obj = sheet.getRange("A1").getValue();
  const keys = Object.keys(obj);
}

getValue() の戻り値は、

  • 空セル → 空文字
  • 場合によっては null

になることがあります。

対処法

null / undefined チェックを必ず入れます。

function sample() {
  const value = getValueSomehow();

  if (value && typeof value === "object") {
    Object.keys(value);
  }
}

よくある原因③:JSON.parse / JSON.stringify 周りの誤解

JSON を Object に変換するつもりが、変換前後を取り違えているケースです。

例:すでに Object のものを JSON.parse している

function sample() {
  const obj = { a: 1 };
  const parsed = JSON.parse(obj);
}

JSON.parse文字列専用です。
Object を渡すと変換できず、この例外が出ます。

対処法

  • JSON.parse → 文字列 → Object
  • JSON.stringify → Object → 文字列

を正しく使い分けます。

const json = JSON.stringify({ a: 1 });
const obj = JSON.parse(json);

よくある原因④:スプレッドシートの値型を勘違いしている

GAS では **シートの値は基本的に「文字列」**として取得されます。

例:JSON 文字列だと思って Object として扱っている

function sample() {
  const value = sheet.getRange("A1").getValue();
  Object.keys(value);
}

セルに { "a": 1 } と入っていても、
取得されるのは 文字列です。

対処法

JSON 文字列の場合は明示的にパースします。

const value = sheet.getRange("A1").getValue();
const obj = JSON.parse(value);
Object.keys(obj);

よくある原因⑤:配列とオブジェクトを取り違えている

配列と Object は似ていますが、用途が違います。

例:配列を Object 前提で処理している

function sample() {
  const list = [1, 2, 3];
  Object.keys(list);
}

これは technically 可能ですが、
意図した結果にならないことが多く、バグの温床です。

対処法

  • 配列 → forEach / map
  • Object → Object.keys

を使い分けます。

list.forEach(v => {
  Logger.log(v);
});

デバッグ時の確認ポイント

このエラーが出たら、次を順に確認します。

  • 処理対象は本当に Object か?
  • null / undefined が混ざっていないか?
  • JSON.parse / stringify の前後を間違えていないか?
  • スプレッドシートの値をそのまま Object 扱いしていないか?
  • 配列と Object を取り違えていないか?

この5点で、ほとんどのケースは特定できます。


再発防止のための書き方

function safeProcess(value) {
  if (!value) return;

  if (typeof value === "string") {
    try {
      value = JSON.parse(value);
    } catch (e) {
      return;
    }
  }

  if (typeof value === "object") {
    Object.keys(value).forEach(key => {
      Logger.log(key);
    });
  }
}
  • 型チェックを入 remind
  • GAS では「想定外の型が来る前提」で書く
  • Logger.log で中身を必ず確認する

まとめ

Exception: Cannot convert ‘xxx’ to Object は、

「Object として扱えない値を、Object 前提で処理している」

ときに発生します。

特に GAS では、

  • スプレッドシートの値型
  • null / undefined
  • JSON 文字列

が混ざりやすいため、型確認を前提にした書き方が重要です。

エラーが出たらまず、
「今この変数は本当に Object か?」
を疑うことが、解決への最短ルートです。

ZIDOOKA!

この記事の内容について、対応できます

この記事に関連する技術トラブルや開発上の問題について個別対応を行っています。

個別対応は3,000円〜 内容・工数により事前にお見積りします
最後までお読みいただきありがとうございました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AI活用に関するポリシー

当サイトでは、記事の執筆補助にAIを活用する場合がありますが、全面的な委任は行いません。