要するに:クイック修正
このエラーは、ほとんどの場合、クエリ文字列自体の構文、つまりQUERY関数の2番目の引数に問題があることを意味します。
- 列参照の確認: データ範囲がA列から始まる場合(例:
A:D)はA, B, Cを、データ範囲がサブセットの場合(例:B1:D100)はCol1, Col2, Col3を使用していますか? - 文字列リテラル:
WHERE句の条件にあるすべてのテキスト値がシングルクォーテーション('text')で囲まれ、クエリ文字列全体がダブルクォーテーション("SELECT ... 'text'")で囲まれていることを確認してください。 - 日付リテラル: 日付には特定の形式が必要です:
DATE 'YYYY-MM-DD'。 - クォーテーションのエスケープ: 文字列リテラル自体にシングルクォーテーションが含まれている場合、それらを二重にする必要があります(例:
'O''Malley')。 - キーワードの欠落: クエリの先頭に
SELECTがあることを確認してください。
詳細な根本原因
Google SheetsのQUERY関数は非常に強力で、スプレッドシートにSQLのような機能をもたらします。エラーメッセージUnable to parse query string for Function QUERY parameter 2は、Google Visualization API Query Languageのインタープリターが、あなたが何をしようとしているのか理解できなかったことを示しています。
QUERY関数のパラメーター2は実際のクエリ文字列です(例: "SELECT A, B WHERE C > 10")。これは、シート内のデータ型や、最初のパラメーターに選択した範囲に関するエラーではありません。純粋にクエリ文字列内で使用されている文法と語彙に関するものです。
間違った文法構造や誤用された単語で外国語を話そうとするようなものです。聞き手(Google Sheets)はあなたの意図を解析できません。この解析失敗の一般的な理由は以下の通りです。
- 不適切な列識別子:
A, B, CとCol1, Col2, Col3を不適切に混用している。 - 文字列リテラルの不適切なクォーテーション:
WHERE句内のテキスト値はシングルクォーテーションで囲む必要があります。 - 不正確な日付/時刻リテラル: 日付と時刻には特定の構文があります。
- キーワード/句の欠落または誤った配置:
SELECT、WHERE、GROUP BYなどを忘れる、または間違った順序で配置する。 - タイプミスまたは無効な構文: クエリ文字列内のキーワードや関数名における単純な間違い。
- エスケープされていない特殊文字: 特に文字列リテラル内のシングルクォーテーション。
修正アプローチ
よくある落とし穴と、それらを修正する方法を詳しく見ていきましょう。
1. 列参照: A, B, C vs. Col1, Col2, Col3
これは非常によくあるエラーの原因です。列を参照する方法は、QUERYに提供する範囲によって異なります。
QUERYのdata範囲がA列から始まり、列全体をカバーする場合(例:A:D,A1:D100)、列は文字名(A, B, C)を使用して参照する必要があります。data範囲がA列から始まらない列のサブセットである場合(例:B1:D100)、またはサブセットを表す名前付き範囲を使用している場合、選択した範囲内の相対的な列番号を参照するためにCol1, Col2, Col3を使用しなければなりません。Col1は選択した範囲の最初の列、Col2は2番目の列、といった具合になります。
誤った例(サブセット範囲で列文字を使用):
=QUERY(B1:D100, "SELECT B, C WHERE D > 10")
間違いの理由: 範囲B1:D100は、列BがQUERYが認識するデータの最初の列であることを意味します。したがって、BはCol1、CはCol2、DはCol3であるべきです。
修正例:
=QUERY(B1:D100, "SELECT Col1, Col2 WHERE Col3 > 10")
別の誤った例(IMPORTRANGEでよくあるケース):
=QUERY(IMPORTRANGE("spreadsheet_url", "Sheet1!C:Z"), "SELECT A, B WHERE C = 'Status'")
間違いの理由: ここでのIMPORTRANGEはC列から始まるデータを取り込んでいます。そのため、A、B、Cはインポートされた範囲内では有効な列参照ではありません。CはCol1、DはCol2などとなります。
修正例:
=QUERY(IMPORTRANGE("spreadsheet_url", "Sheet1!C:Z"), "SELECT Col1, Col2 WHERE Col3 = 'Status'")
2. 文字列リテラルとクォーテーション
WHERE句(またはテキストを期待する他の句)内のすべてのテキスト値は、シングルクォーテーション(')で囲む必要があります。クエリ文字列自体はダブルクォーテーション(")で囲みます。
誤った例:
=QUERY(A:C, "SELECT A, B WHERE C = Active")
間違いの理由: Activeは引用符で囲まれていないため、列名または無効なキーワードとして扱われます。
修正例:
=QUERY(A:C, "SELECT A, B WHERE C = 'Active'")
文字列内のシングルクォーテーションのエスケープ:
検索する文字列にシングルクォーテーション(例: "O'Malley")が含まれている場合、それを二重にしてエスケープする必要があります。
誤った例:
=QUERY(A:B, "SELECT A WHERE B = 'O'Malley'")
間違いの理由: パーサーは'O'を文字列として解釈し、その後Malley'を引用符で囲まれていない無効な部分として解釈します。
修正例:
=QUERY(A:B, "SELECT A WHERE B = 'O''Malley'")
3. 日付と時刻のリテラル
日付と時刻はQUERYで特定の構文を持ちます。日付はDATE 'YYYY-MM-DD'の形式である必要があります。時刻はTIME 'HH:MM:SS'、日付時刻はDATETIME 'YYYY-MM-DD HH:MM:SS'が必要です。
誤った例:
=QUERY(A:B, "SELECT A WHERE B > '2023-01-01'")
間違いの理由: QUERYは'2023-01-01'を単なる文字列ではなく日付として理解するために、DATEキーワードを必要とします。
修正例:
=QUERY(A:B, "SELECT A WHERE B > DATE '2023-01-01'")
4. キーワードの欠落または無効な構文
- 常にクエリ文字列を
SELECTで始めてください。 - 句が正しい順序であることを確認してください:
SELECT,WHERE,GROUP BY,PIVOT,ORDER BY,LIMIT,OFFSET,LABEL,FORMAT,OPTIONS。 - キーワードのタイプミスがないか確認してください(例:
WHEREの代わりにWHER)。
誤った例:
=QUERY(A:B, "A, B WHERE C = 'Done'")
間違いの理由: SELECTキーワードが欠落しています。
修正例:
=QUERY(A:C, "SELECT A, B WHERE C = 'Done'")
5. セル参照を使用してクエリを構築する
クエリの一部を動的にしたい場合(例: セルD1の値に基づいてフィルタリングする場合)、&演算子を使用してクエリ文字列の各部分を連結する必要があります。引用符に細心の注意を払ってください!
セルD1にステータス「Pending」が含まれているとします。
誤った例:
=QUERY(A:C, "SELECT A, B WHERE C = D1")
間違いの理由: D1は、セル参照ではなく、クエリ内でリテラル文字列「D1」として扱われます。
修正例(D1のテキスト用):
=QUERY(A:C, "SELECT A, B WHERE C = '" & D1 & "'")
説明:
"SELECT A, B WHERE C = '": 文字列を開始し、値の開始シングルクォーテーションを含みます。& D1 &: セルD1の値を連結します。"'": 値のシングルクォーテーションを閉じ、クエリ文字列全体のダブルクォーテーションを閉じます。
修正例(D1の数値用):
=QUERY(A:C, "SELECT A, B WHERE C = " & D1)
数値の場合、D1の周りにシングルクォーテーションがないことに注意してください。
修正例(D1の日付用、例: 2023-01-15):
=QUERY(A:B, "SELECT A WHERE B > DATE '" & TEXT(D1, "yyyy-mm-dd") & "'")
説明: TEXT(D1, "yyyy-mm-dd")を使用して、D1がDATEリテラルの文字列として正しくフォーマットされるようにします。
デバッグ戦略
複雑なクエリの場合、以下のように分解して考えましょう。
- シンプルに始める: まずは
SELECT Col1, Col2だけで開始し、列参照が正しいことを確認します。 - 一度に1つの句を追加する: 次に
WHERE、その後GROUP BY、ORDER BYなどを導入します。追加ごとにテストしてください。 - 完全なクエリ文字列を検査する: クエリを直接
QUERYに入力する代わりに、連結を使用して別のセル(例:D2)で構築し、そのD2をQUERY関数で参照します:=QUERY(A:C, D2)。これにより、QUERYが解析しようとしている正確な文字列を視覚的に検査できます。
クエリ文字列を検査する例:
// セルD2でクエリ文字列を構築します:
="SELECT A, B WHERE C = '" & E1 & "' ORDER BY A DESC"
// セルF1で構築されたクエリ文字列を参照します:
=QUERY(A:C, D2)
このようにすることで、F1でエラーが発生した場合、D2が生成した正確な文字列を確認し、デバッグすることができます。
検証手順
- 数式の出力の確認: 修正を適用したら、
QUERY関数は「Unable to parse query string」エラーなしで実行されるはずです。 - データの検証:
QUERY関数によって返される結果が期待通りであることを確認してください。構文の修正によってクエリが実行されるようになることもありますが、微妙な論理エラーが残っている場合(例: シートに'active'と書かれているのに'Active'を検索している場合など)、正しくフィルタリングまたは選択されていない可能性があります。 - エッジケースのテスト: クエリがセル参照を使用している場合、参照セルの値を変更して、クエリが壊れることなく正しく適応するかどうかを確認してください。
参考資料
- 包括的なガイドについては、Googleの公式ドキュメントで「Google Sheets QUERY function」を検索してください。
- 基盤となる言語仕様については、「Google Visualization API Query Language Reference」を参照してください。

