Googleスプレッドシートで作った月次レポートを、クライアント共有用にExcel形式(.xlsx)でダウンロードした時、普通はグラフもきちんと引き継がれるんだけど、勝手にExcelがファイルを修復し始めてグラフが「#REF!」で空になってしまう現象があったのでその対応の履歴をメモ。
発端
ファイルを開くと、Excelから「ファイルを修復しました」という不穏なポップアップが。「あーまたか」って画面を見ると、セルの数値は正常に表示されているのに、グラフがあった場所だけが「#REF!」と表示され、中身が綺麗さっぱり空っぽになっていた。
「いやいや、Googleスプレッドシートのグラフって、Excelにすると消えるんかーい」と言うわけで普通はAIに聞くか検索するやん?
ネットで調べても「値のみ貼り付け直しましょう」「範囲を選び直しましょう」といった、実務では使えない表面的な解決策ばかりだし、AIに原因を聞きながら修正にチャレンジしたけど…そこから「AIの知ったかぶりに振り回させる(全部ハズレ)」という、いつものアレが始まった。
結果として、GoogleとMicrosoftの、と言うかアメリカ製製品あるある「2つの盲点」が原因だったのでメモ。必ずこの方法が当たってるとは限らないけど、この記事が参考になるかもしれない。
AIの「もっともらしい嘘」に振り回される
まずはAIにエラーログを見せながら相談してみた。すると、AIはドヤ顔でこんなアドバイスをしてきた。
「Excelに対応していないGoogle独自の関数(IMPORTRANGE や QUERY)を使っていませんか?」
「非表示の行や列、フィルタ機能が残ったままダウンロードするとXMLがクラッシュしますよ!」
「グラフのデータ件数が多すぎて、Excelの処理限界を超えたバグです!」
うん。違う(笑)
フィルタなんてかかっていないし、データ範囲も30行程度で極めてシンプルだし。関数も、他の正常なシートと全く同じシンプルな IF 関数を使っている。
シートは全部で10枚くらいあって、そんな特別な関数も使ってないつもり。全部のシートで似たような処理をしてる。でもなぜか特定のシートだけがピンポイントで壊れる…
なのでとりあえずこっちの勘でどうにかするしかないよねえ。
犯人(1):独自関数 ✕「日本語(マルチバイト文字)」のパースバグ
壊れたシートの数式を見直す。Excelは変換に失敗すると変な事をしがち。こういう挙動はMicrosoftの文化だと思う。
【変換前(スプレッドシート)】
=REGEXREPLACE(data2!A11, " -|– .+$", "")【変換後(Excel)】
=IFERROR(@__xludf.DUMMYFUNCTION("REGEXREPLACE(…)"), "ほげほげ(変換後の値)")REGEXREPLACE(正規表現の置換)はGoogle独自の関数で、Excelには存在しない。
そのためスプレッドシート側は、Excelが読めるように @__xludf.DUMMYFUNCTION というダミー関数に無理やり書き換えて修復してた。
アメリカ圏で作られたプログラムの多くは、ASCII文字(半角英数)だけはやたら検証されてるけど日本語とかにはあんまり興味ない、ってかアメリカ人って割とアメリカ以外を世界だと思って無い感じある。(外国で出身聞かれてもアメリカって言わずに州から言うし。)
で、たぶんだけど「正規表現の特殊文字」+「シート名」+「日本語の記号系文字コード(全角文字)」が絡んだ結果、式のパース(解析)エラーが発生して、Excelが起動時に「壊れた数式だ」と判断して数式を強制削除したのかなーと。
【解決策】どちらでも動く「互換数式」に書き換える
で、もうしゃーないのでExcel側でも動くように、LEFT 関数と FIND 関数を組み合わせた以下の数式に差し替えたらOKっぽかった。(ええんか?)
=IFERROR(LEFT(data2!A11, MIN(IFERROR(FIND(" -", data2!A11), 999), IFERROR(FIND("–", data2!A11), 999))-1), data2!A11)正規表現好きなんだけどなあ。
犯人(2):シート名に紛れ込んだ全角の「:」
数式を直して一歩前進したものの、まだグラフが #REF! になる現象が残っていた。
そこでGoogleスプレッドシート側のシート名に目をやると、ある共通点に気づく。
「うーんもしかして…シート名の全角の『:』アカンの?」
いや、Excelのシート名に半角の「:」が使えないのは有名な仕様(禁則文字)、知ってる。でもExcelって全角の「:」もExcel側が「不正な文字」と検知して「使えません」て出てくるの思い出した。
で、まーたExcelの「お節介な自動修復」が発動、Excelはファイルを開く際、シート名を強制的に「別の安全な名前」に書き換えて修復するやん?シート名だけが勝手に変わるやん?結果、グラフ側に設定されてたデータ参照先(元のシート名)が壊れて#REF! になる。たぶん。
【解決策】シート名には全角でも記号を使わない
というわけで、ダウンロードする前に、スプレッドシート側でシート名から「:」を削除した。これだけでグラフの破損は止まった。
「全角だから行けるやろ」が盲点でした。
まとめ:AIの時代になっても「オッサンの勘」の方がマシだな…(と思う事もある)
今回で学んだのは、Google×Microsoftの互換性での注意点:
Excel未対応の関数内に「日本語(マルチバイト文字)」を混ぜると、変換時に内部データがクラッシュする。(かもしれない)
シート名には、全角であってもコロン(:)やスラッシュ(/)などの記号は絶対に使わない。(全角でもイケない)
こういう細かい話はAIの(英語圏の文化に染まった)学習セットには入ってないし、他のブログとかにもあまり出てこないからAIからしたら「Web検索したらこんなん出てきました」ってハズレなのにそれっぽい感じで言っちゃうのは仕方ないと思う(笑)
オッサンなので「アメリカ製のシステムは、日本語の文字コード処理が甘いどころか全く考慮されてない場合も多い」ってのを知ってたから良かった。
最近は「どーせAIの養分になって終わりだろ」って思ってあまり知識を共有しないけど、「ブログ記事を書いて誰かの参考にしてもらう」ってのと、「AIに養分を与えて誰かの参考になる」のもそれほど変わらないかもしれないな、と思ったりする。
(どうでもいいけどSEとかがスプレッドシートの事を「スプシ」って言ってたの面白かった。機会があれば使っていきたい。)
