GAS『Cannot Find Method』の原因と対処法
- 作成日 2025.10.22
- その他
Google Apps Scriptで「Cannot find method xxx(…)」は、呼び出したメソッド名や引数の型・個数が、受け手のオブジェクトやそのオーバーロードと一致しないときに出る。典型は setValues に1次元配列、Calendar の createEvent に文字列日時、Range と Sheet の取り違え、A1表記と行列指定の混同、オプション引数の型不一致など。メッセージに出るシグネチャ(xxx(string, number, …))を手掛かりに、正しいメソッド/引数へ直す。
- 1. エラーの意味と出やすい場面
- 2. ケース1:setValues に1次元配列(サイズ不一致)
- 3. ケース2:setValue と setValues の混同
- 4. ケース3:CalendarApp.createEvent に文字列日時
- 5. ケース4:Range と Sheet の取り違え
- 6. ケース5:getRange の指定形式ミス(A1 vs 行列)
- 7. ケース6:UrlFetchApp.fetch のオプション型不一致
- 8. ケース7:背景・書式系APIの単数/複数メソッドの取り違え
- 9. ケース8:MailApp.sendEmail のシグネチャ取り違え
- 10. ケース9:Advanced Sheets API のボディ構造違い
- 11. ケース10:RichText/Fonts などで配列次元を誤る
- 12. メッセージの読み方(手掛かりの活用)
- 13. 防御的ユーティリティ(安全に型を合わせる)
- 14. NG→OK 早見表
- 15. チェックリスト(上から順に)
エラーの意味と出やすい場面
・該当メソッドが存在しない(名前のタイポ/大文字小文字の違い)
・メソッドはあるが、引数の「型・個数」が一致しない(オーバーロード解決に失敗)
・対象オブジェクトを取り違えている(Range のメソッドを Sheet に呼ぶ 等)
・A1表記/行列指定の取り違え、1次元/2次元配列の取り違え
・Date を要求する場所に文字列、オプションをオブジェクトで渡すべき所に文字列 など
ケース1:setValues に1次元配列(サイズ不一致)
// NG:範囲(3x1)に1次元配列
const values = ['a','b','c'];
sheet.getRange(1,1,3,1).setValues(values); // Cannot find method setValues(object)
// OK:2次元配列で範囲サイズと一致
const values2d = [['a'],['b'],['c']];
sheet.getRange(1,1,3,1).setValues(values2d);ケース2:setValue と setValues の混同
// NG:単一セルに2次元配列を渡す
sheet.getRange('A1').setValue([['x']]); // Cannot find method setValue(object)
// OK:単一値を渡す
sheet.getRange('A1').setValue('x');ケース3:CalendarApp.createEvent に文字列日時
// NG:Date ではなく文字列を渡している
CalendarApp.getDefaultCalendar()
.createEvent('mtg', '2025-10-20 10:00', '2025-10-20 11:00');
// Cannot find method createEvent(string,string,string)
// OK:Date を渡す
const start = new Date('2025-10-20T10:00:00+09:00');
const end = new Date('2025-10-20T11:00:00+09:00');
CalendarApp.getDefaultCalendar().createEvent('mtg', start, end)ケース4:Range と Sheet の取り違え
// NG:Sheet に Range のメソッドを呼んでいる
const sh = SpreadsheetApp.getActiveSheet();
sh.setFontWeight('bold'); // Cannot find method setFontWeight(string)
// OK:Range に対して呼ぶ
sh.getRange('A1:C3').setFontWeight('bold');ケース5:getRange の指定形式ミス(A1 vs 行列)
// NG:行・列引数に文字列を渡す
sheet.getRange('2','3'); // Cannot find method getRange(string,string)
// OK:A1 か数値に統一
sheet.getRange('B2');
sheet.getRange(2,2);ケース6:UrlFetchApp.fetch のオプション型不一致
// NG:第2引数はオブジェクトが必要
UrlFetchApp.fetch('https://example.com', 'GET'); // Cannot find method fetch(string,string)
// OK:オプションオブジェクトで渡す
UrlFetchApp.fetch('https://example.com', { method: 'get', muteHttpExceptions: true });
ケース7:背景・書式系APIの単数/複数メソッドの取り違え
// NG:setBackgrounds は 2次元配列を期待
sheet.getRange(1,1,2,2).setBackgrounds('yellow'); // Cannot find method setBackgrounds(string)
// OK:全セル分の2次元配列を渡す
sheet.getRange(1,1,2,2).setBackgrounds([['yellow','yellow'],['yellow','yellow']]);
// 単一値なら setBackground
sheet.getRange('A1').setBackground('yellow');ケース8:MailApp.sendEmail のシグネチャ取り違え
// NG:件名や本文に不正な型
MailApp.sendEmail('to@example.com', {subject:'x'}, 123); // Cannot find method sendEmail(string,object,number)
// OK:シンプル or オプションオブジェクト
MailApp.sendEmail('to@example.com','件名','本文');
MailApp.sendEmail({to:'to@example.com',subject:'件名',htmlBody:'<b>本文</b>'});
ケース9:Advanced Sheets API のボディ構造違い
// NG:values は 2次元配列必須
Sheets.Spreadsheets.Values.update({ value: 'x' }, SHEET_ID, 'A1',
{ valueInputOption: 'RAW' }); // Cannot find method ...
// OK
Sheets.Spreadsheets.Values.update({ values: [['x']] }, SHEET_ID, 'A1',
{ valueInputOption: 'RAW' });ケース10:RichText/Fonts などで配列次元を誤る
// NG:setFontWeights は 2次元配列
sheet.getRange(1,1,2,2).setFontWeights(['bold','bold']); // Cannot find method setFontWeights(object)
// OK
sheet.getRange(1,1,2,2).setFontWeights([['bold','bold'],['bold','bold']]);
メッセージの読み方(手掛かりの活用)
・エラー文の括弧内に Apps Script が受け取った「型の並び」が表示される(例:setValues(object) / createEvent(string,string,string))。この並びと公式シグネチャを見比べ、必要な型(Date / string / 2D array など)に合わせる。
・対象オブジェクト(Range / Sheet / Spreadsheet / Calendar など)が正しいかを先に確認。
防御的ユーティリティ(安全に型を合わせる)
const V = {
to2D: (arr) => Array.isArray(arr[0]) ? arr : arr.map(v => [v]),
req: (cond, msg) => { if (!cond) throw new Error(msg); }
};
// 例:範囲サイズに合わせて setValues(サイズ検証付き)
function safeSetValues(range, values) {
const twoD = V.to2D(values);
const rows = range.getNumRows();
const cols = range.getNumColumns();
V.req(twoD.length === rows && twoD[0].length === cols, '範囲と2次元配列のサイズが一致しません');
range.setValues(twoD);
}NG→OK 早見表
// setValues に1次元 → 2次元配列に
sheet.getRange(1,1,3,1).setValues(['a','b','c']);
sheet.getRange(1,1,3,1).setValues([['a'],['b'],['c']]);
// Date を文字列で → Date に
CalendarApp.getDefaultCalendar().createEvent('mtg','2025-10-20','2025-10-20');
CalendarApp.getDefaultCalendar().createEvent('mtg', new Date('2025-10-20T00:00:00+09:00'), new Date('2025-10-20T01:00:00+09:00'));
// RangeメソッドをSheetへ → Range取得してから
sheet.setFontWeight('bold');
sheet.getRange('A1:C3').setFontWeight('bold');
// fetch 第二引数を文字列 → オプションオブジェクト
UrlFetchApp.fetch('https://example.com', 'GET');
UrlFetchApp.fetch('https://example.com', {method:'get'});チェックリスト(上から順に)
・メソッド名のスペル/大文字小文字は一致しているか
・対象は正しいオブジェクトか(Range と Sheet を混同していないか)
・引数の個数・順序・型は公式シグネチャと一致しているか
・Date が必要な場所に Date を渡しているか(文字列のままにしていないか)
・配列は 2次元が必要か? 範囲サイズと一致しているか
・オプションはオブジェクトで渡す必要があるか(fetch/sendEmail など)
・Advanced Services のリクエストボディの型が合っているか(values の 2次元配列 等)
-
前の記事
GAS『Invalid Argument: Expected』の原因と対処法 2025.10.21
-
次の記事
GAS『OAuth2 Authorization』の原因と対処法 2025.10.22
コメントを書く