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 か?」
を疑うことが、解決への最短ルートです。