質問: tds.length; //番号 Logger.log(tds[0]); //取得できた番号をシートに書き込み sheet.getRange('F2').setValue(tds[0]); //氏名 Logger.log(tds[1]); //取得できた氏名をシートに書き込み sheet.getRange('G2').setValue(tds[1]); //ふりがな Logger.log(tds[2]); //取得できたふりがなをシートに書き込み sheet.getRange('H2').setValue(tds[2]); //メールアドレス Logger.log(tds[3]); //取得できたメールアドレスをシートに書き込み sheet.getRange('I2').setValue(tds[3]); //年齢 Logger.log(tds[4]); //取得できた年齢をシートに書き込み sheet.getRange('J2').setValue(tds[4]); //学年 Logger.log(tds[5]); //取得できた学年をシートに書き込み sheet.getRange('K2').setValue(tds[5]); //種別 Logger.log(tds[6]); //取得できた種別をシートに書き込み sheet.getRange('L2').setValue(tds[6]); //曜日 Logger.log(tds[7]); //取得できた曜日をシートに書き込み sheet.getRange('M2').setValue(tds[7]); //時間 Logger.log(tds[8]); //取得できた時間をシートに書き込み sheet.getRange('N2').setValue(tds[8]); //理由 Logger.log(tds[9]); //取得できた理由をシートに書き込み sheet.getRange('O2').setValue(tds[9]); } ```
回答: まず回答の前に気になった点が何点かあります。 今後プログラムをしていくにあたって重要な部分にもなりますので理解しておいていただればと思います。 **1質問への追記でも記載しましたが、カッコの数が合っていない件** カッコの数が合っていないことは分かったかと思いますが、それによって今どうなっているか分かるでしょうか? 添付のプログラムで結構な行数を書いていますが、parseXml関数を呼んだ時 ``` function parseXml() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('シート1'); const range = sheet.getRange('E2'); const lastRow = sheet.getLastRow(); for(let i = 2; i <= lastRow; i++) { console.log(sheet.getRange(i, 1).getValue()); } } ``` プログラムは上記のところまでで実行は終わり、それより下は実行されません。 function parseXml() { で始まった開きカッコが上記の最終行で閉じられているのですから。 そこより下のプログラムでHTMLデータを分解しているので、 どうやっても分解後のデータをF〜Oに入れるなんてことはできない状態なのです。 **2for文を入れる位置** 上記でも書きましたが、for文より下の行でHTMLデータを分解しているのです。 つまりfor文が実行されている位置ではHTMLデータは分解されておらず、出力しようにも 準備ができていない状態です。 for文をもし入れるのであれば最後の方でしょう。 そしてconsole.logで出力する際のgetRange(i, 1)の指定の仕方も違うかと思います。 getRangeの指定の仕方はgetRange(何行目か, 何列目か) です。 今の状態は1列目に固定した状態で、for文で2行目から最終行までループしてしまっています。 以上、色々書いてしまいましたが今後の参考になれば幸いです。 では本題の回答ですが、こちらで確認ができないので下記をお試しください。 なおログ出力関係のプログラムは省きますので、必要であれば追加してください。 ``` function parseXml() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('シート1'); const lastRow = sheet.getLastRow(); // 2行目から最終行までループ for(let i=2; i<=lastRow; i++) { // HTMLデータの読み込み先はi行目の5列目( E列 ) const range = sheet.getRange(i, 5); // HTMLデータを分解 var data = Parser.data(range.getValue()).from('').build(); var tds = Parser.data(data).from('').to('').iterate(); // tdsの数( F~Oまでだから10個 )だけループ for(let s=0; s