GAS『Cannot Find Method』の原因と対処法

GAS『Cannot Find Method』の原因と対処法

Google Apps Scriptで「Cannot find method xxx(…)」は、呼び出したメソッド名や引数の型・個数が、受け手のオブジェクトやそのオーバーロードと一致しないときに出る。典型は setValues に1次元配列、Calendar の createEvent に文字列日時、Range と Sheet の取り違え、A1表記と行列指定の混同、オプション引数の型不一致など。メッセージに出るシグネチャ(xxx(string, number, …))を手掛かりに、正しいメソッド/引数へ直す。

エラーの意味と出やすい場面

・該当メソッドが存在しない(名前のタイポ/大文字小文字の違い)

・メソッドはあるが、引数の「型・個数」が一致しない(オーバーロード解決に失敗)

・対象オブジェクトを取り違えている(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次元配列 等)