• ベストアンサー

JS 動的な作表コード:普通じゃ物足りない?

JavaScript 動的な作表コード:普通じゃ物足りない? 動的に作表するには、次のメソッドが使われています。 createElement, insertRow, insertCell さて、これらを用いずに 作表するにはどんなコードになりますか? 下記のとおり、素材を用意しました。 <script> //表の名称 (caption) const title = "一般果物 エネルギー 上位10"; //表の元データ (分割子は半角スペース) const data = ` 順位 果物名 含量 (Kcal) 1位 中国栗 207 2位 アボカド 178 3位 日本ゆで栗 152 4位 ドリアン 140 5位 バナナ 93 6位 あけび 89 7位 チェリモヤ 82 8位 アテモヤ 81 9位 ホワイトサポテ 73 10位 ぐみ 72`; </script>

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.2

順位、果物名、含量がヘッダっぽいので変更しました。 var table = "<table><caption>" + title + "</caption>"; const row_datas = data.split("\n"); row_datas.shift(); const th_data = row_datas.shift(); table += "<tr><th>" + th_data.trim().replace(/ /g, "</th><th>") + "</th></tr>"; row_datas.forEach(row_data => { table += "<tr><td>" + row_data.trim().replace(/ /g, "</td><td>") + "</td></tr>"; }); table += "</table>"; document.write(table);

retorofan
質問者

お礼

ご回答ありがとうございます。 ここを <table border=1> に変更してセルを明確にしてみました。 document.write(table); これだとBODY内1のコンテンツがかき消されてしまうので ここを insertAdjacentHTMLメソッドを使って確認しました。

その他の回答 (1)

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.1

こんなのはどうでしょうか。 <script> //表の名称 (caption) const title = "一般果物 エネルギー 上位10"; //表の元データ (分割子は半角スペース) const data = ` 順位 果物名 含量 (Kcal) 1位 中国栗 207 2位 アボカド 178 3位 日本ゆで栗 152 4位 ドリアン 140 5位 バナナ 93 6位 あけび 89 7位 チェリモヤ 82 8位 アテモヤ 81 9位 ホワイトサポテ 73 10位 ぐみ 72`; var table = "<table><caption>" + title + "</caption>"; const row_datas = data.split("\n"); row_datas.shift(); row_datas.forEach(row_data => { table += "<tr><td>" + row_data.trim().replace(/ /g, "</td><td>") + "</td></tr>"; }); table += "</table>"; document.write(table); </script>

retorofan
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • JS テキストエリアを多色表示させるには?

    JavaScriptでテキストエリアの数字だけ 赤字にすることはできますか? 「できません」と即答しそうですが、 工夫すれば「できました」になります。(添付図参照) このように、テキストエリアを表示するには どんなコードでできますか? <div class="container"> <textarea class="textArea" readonly></textarea> </div> <script> //テキストエリアに表示するデータ const data = [ ["== The Body Mass Index (BMI) RESULT =="], [" "], ["DANDY 身長 170cm, 体重 70Kg, BMI: 24.2, Normal"], ["CHUBBY 身長 160cm, 体重 70Kg, BMI: 27.3, OverWeight"], ["FATMAN 身長 150cm, 体重 70Kg, BMI: 31.1, Obese Class I"], ]; </script>

  • chart.js4.2でカラー設定をする方法

    過去にこのサイトでchart.js2.9を使い複数グラフを表示する方法(https://okwave.jp/qa/q9834370.html)を教えてもらいましが、今回v.4.2にそれを適用するにあたりプラグインのカラー設定に代わる方法がないかと試行を繰り返し、素人のため無理筋の方法ですが下記のコードまで至りました。そこで、このお粗末なコードを適切なものに手直ししていただきたくお願い申し上げます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;width:300px; height:250px" > <canvas id="myChart1"></canvas></div> <div class="chart2" style="float: right;width:300px; height:250px"> <canvas id="myChart2"></canvas></div> <div class="chart3" style="bottom: 0;float: left;width:300px; height:250px"> <canvas id="myChart3"></canvas></div> <div class="chart4" style="bottom: 0;float: right;width:300px; height:250px"> <canvas id="myChart4"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"></script> <script> function displayChart(canvasId, chartType, datasets, options) { var ctx = document.getElementById(canvasId); var myPieChart = new Chart(ctx, { type: chartType, data: { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // X軸のラベル datasets: datasets }, options: { plugins: { //responsive: false, title: { display: options.title.length > 0, // タイトルがあれば表示 text: options.title }, legend: { // 凡例 display: true, // 表示の有無 position: options.legendPosition, // 表示位置 labels: { usePointStyle: options.usePointStyle // 円の凡例スタイルを使うか } } } } }); } const color1 = ['red','green','skyblue']; const mycolor = ['rgb(221,160,221)','rgb(228,0,127)','rgb(160,216,239)','rgb(146,7,131)','rgb(0,153,68)','rgb(255, 215, 0)','rgb(0,158,150)']; const label1 = [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000],backgroundColor:mycolor}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000],backgroundColor:mycolor}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000],backgroundColor:mycolor} ]; const datasets = [ {label: label1[0].label,data: label1[0].data,backgroundColor:color1[0]}, {label: label1[1].label,data: label1[1].data,backgroundColor:color1[1]}, {label: label1[2].label,data: label1[2].data,backgroundColor:color1[2]} ]; displayChart('myChart1', 'bar', datasets,{ title: '', usePointStyle: false, legendPosition: 'top', }); for (var i = 0; i < 3; i++) { displayChart("myChart".concat(i + 2), 'pie', [label1[i]], { title: label1[i].label, backgroundColor:mycolor, usePointStyle: true, legendPosition: 'left' }); } </script> </body> </html> 特にbackgroundColorの設定をoptionで設定出来ないかと思いましたが方法が分かりませんでしたのでこのようなコードをに成り果てました。 また、カラースキーム組み合わせは別の手段を使って作りコピペしているのですがこれも貧弱なものですので、使えるプラグインがあればご教授お願いいたします。

  • キャラクターコード表を出力させたいのですがasc(0x41)でAとなるような関数はjavascriptであるのでしょうか?

    キャラクターコード表を出力させたいのですがasc(0x41)でAとなるような関数はjavascriptであるのでしょうか? http://hp.vector.co.jp/authors/VA008536/data/ascii.html <script type="text/javascript"> <!-- var s = ''; for (var i=0x20; i<0x7f; i++){ s += [関数?] } document.write(s); // --> </script>

  • JavaScript 手作業から解放されたいのです

    今、インラインフレームにデータを読み込んで作表するサンプルを作成中です。 インラインフレームには select() メソッドが使えないために 手作業でテキストエリアに copy&pasteしている状態です。 この手作業から解放されたいのですが、どういうコードでできますか? スキルある方のお力添えをお待ちしております。 【親ページ】parent.html <body> <div>parent.html 親ページです.</div> <style> body { background: lavender; } .wrap { list-style-type: none; display: flex; width: 640px; padding: 1.5em; background: lightgreen; border-radius: 10px; } form > div { margin-top: 1em; font-weight: bold; } label { display: block; } pre b { color: red; } #iframe3 { width: 300px; height: 160px; background: #eee; } #textArea { margin-left: 10px; width: 300px; height: 160px; } </style> <pre> 【テーマ】子ページ内のデータで作表する <条件> ・子ページの情報で親ページに作表する ・ローカル環境(当然 Ajax(XMLHttpRequest)は対象外、new FileReader不使用) ・ファイルは、親子とも同じ場所 ・現在は、<b>読込ファイル選択 ▶ IFRAMEをCTRL+C ▶ TEXTAREAでCTRL+V ▶ 作表ボタン押下 ▶ 作表</b>  理想は、手作業を省略して、<b>読込ファイル選択 ▶ 作表</b> </pre> <ul class="wrap"> <li>(1)[IFRAME](理想は非表示に) <iframe id="iframe3" src="./20230515-child.tsv" title="子ページ"> </iframe> </li> <li> (2)[TEXTAREA](理想は非表示に) <textarea id="textArea" placeholder="貼付場所"></textarea> </li> </ul> <form name="form1"> <div>読込データファイルの選択</div> <label><input name="cbox" type="radio" value="0" checked> 1.TSVファイル (タブ区切り .tsv)</label> <label><input name="cbox" type="radio" value="1"> 2.HTMLファイル</label> </form> <p> <button id="button1">作表</button> <table id="listTable"></table> </p> <script> (function () { //エレメント const iframe = document.getElementById('iframe3'); const table = document.getElementById('listTable'); const textArea = document.getElementById('textArea'); const button1 = document.getElementById('button1'); //読み込みファイルの選択 document.form1.onchange = function(event) { let n = event.target.value; iframe.src = "./child." + ["tsv","html"][n]; } //作表処理 button1.onclick = function (){ // 値を全選択してコピー (※使用不可能) // iframe.select(); // var result = document.execCommand("copy"); //------------------------------------------------------------- // 整形 文字データの配列化 作表 // (略) //------------------------------------------------------------- }; })(); </script> </body> 【子ページ1】child.tsv 番号 名称 半径 衛星個数 1 水星 2,439 0 2 金星 6,051 0 3 地球 6,378 1 4 火星 3,396 2 5 木星 71,492 95 6 土星 60,268 104 7 天王星 25,559 27 8 海王星 24,764 14 9 冥王星 1,188 5 【子ページ2】child.html <pre> 番号 名称 半径 衛星個数 1 水星 2,439 0 2 金星 6,051 0 3 地球 6,378 1 4 火星 3,396 2 5 木星 71,492 95 6 土星 60,268 104 7 天王星 25,559 27 8 海王星 24,764 14 9 冥王星 1,188 5 </pre>

  • エクセルで、データを統一する方法

    いつもお世話になっております。 データを統一する方法を教えてください。 添付している表は、例なのですが、A店、B店、C店それぞれの果物の売上個数です。 A店、B店はデータ入力法が同じなので果物名の文字フォントが同じなのですが、C店だけは半角カタカナのため、ピボットテーブルでデータを統合したときに完全には統一されません。 ただ、YJコードは同じなので、添付しているピボットテーブルのように表示されます。 YJコードの行(ピボットテーブルの)は、3店舗すべてのデータが横並びになっているので、この行だけを使いたいのですが、YJコードの表示では、品名が分りません。なので、このYJコードを品名(ひらがなの方)に変換したいのですが、それが出来る方法はありますでしょうか? 実際には800品目くらいあります。 YJコード部分をひらがなの品名に変換(統一?)後、下の不要な2行を削除する方法も教えていただけると嬉しいです。 よろしくお願い致します。

  • EUCのデータファイルをShift_jisで読み込む方法

    初めまして。 perlの知識は殆ど無く、見よう見まねで改造をするレベルです。 質問させて頂きたいのですが、 あるスクリプトにてEUCで保存(書き込まれた)されたデータファイルを、違うスクリプトにてそのデータファイルを読み込む際に、Shift_jisで読み込みたいのですが、どのような方法がありますでしょうか? それぞれのスクリプトを共通の文字コードで保存すれば良いのですが、データを保存する側のスクリプトでShift_jisにすると、"表"や"ー"などのデータが登録できなく、それの対処方法が解らなかった為、そのスクリプトとデータファイルをEUCで保存する事によって解決する事はできましたが、今度は別のスクリプトでそのデータファイルを読み込む必要があり、読み込む側ではShift_jisで保存されているスクリプトですので、文字化けが起こりデータファイルを読み込む事ができない状況です。 この読み込む側のスクリプトをEUCで保存をするのも検討しましたが、読み込む側のスクリプトが一つではなく複数ありますので、できればこれらはShift_jisのままで、データファイルを読み込む際に「Shift_jisに変換して読み込む」行為ができればと思い、質問させて頂きました。 ※具体的には会員登録用スクリプトとその登録されたデータファイルがEUCで保存されており、会員データファイルを読み込む全く別の掲示板などのスクリプトがShift_jisで保存されています。 もし宜しければご教授頂けますと幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • JavaScript のTypeError

    Uncaught TypeError: Cannot read properties of null (reading 'appendChild') at add というエラーで困っています。 初心者向け動画 https://www.youtube.com/watch?v=E08jeQBa1D0 さんでそのままのコードを打ったつもりですが、「テキストボックスに文字を入れて、エンターを押すと値がリストに追加されていく」という動きができません。 コードはこちらです。(動画のままを打ったつもりです) [HTML] <body class="bg-light"> <div class="container w-75"> <h1 class="text-center text-info my-4"> todo</h1> <form id="form" class="mb-4"> <input type="text" id="input" placeholder="todoを入力" autocomplete="off" class="form-control"> </form> <ul class="list-group text-secondary"></ul> </div> <script src="index.js"></script> </body> [JS] const form = document.getElementById("form") const input = document.getElementById("input") const ul = document.getElementById("ul") form.addEventListener("submit", function (event) { event.preventDefault() console.log(input.value) add() }) function add() { const li = document.createElement("li") li.innerText = input.value li.classList.add("List-group-item") ul.appendChild(li) //ここでエラー input.value = "" } HTMLを生成するときにulがなくて追加できない、という意味であってるでしょうか。 何が原因なのか知りたいです。

  • JS エクスプローラーからのD&Dで作表したい

    前回はiframeからの情報で親ページに作表するように 検討しました。(https://okwave.jp/qa/q10136205.html) しかし、セキュリティ上の制限でできないようだと判断して 諦めました。(できる方は是非ご教示願います) 今回は、エクスプローラーで ファイルAPI(Drag&Drop)を用いて作表することを 検討しています。 できるだけシンプルなコードでは、どうなりますか? スキルをお持ちの方のお力添えをお願い申し上げます。 (HTML素材は、前回のものをお使いいただけます)

  • エクセルのグラフで横軸を最新の30個で自動更新

    HohoPapaさん いつもお世話になっております。 さて前日下記のコードを教わって随時他のBookにも展開中です。 非常に使いやすく汎用で助かっているのですが、当初からある程度想定された問題が発生しました。 当然あり得るケースとしてグラフ要素が1つしかない場合です。 本日上記のケース(1列以外は5以下、10以上、合格、・・・)が出てきました。 おそらく同じ列を入れればグラフの見た目は1本にできると思っていたのですが、何ともならず。 今更ですが、お恥ずかしい限りで申し訳ありませんがグラフ要素1つの場合の対応をお願いできませんでしょうか? 文字列を指定するとX軸に表示されるようです。(値0のグラフではなくX軸に文字が表示されます) 両方兼用だと複雑になるようなら、別のコード(このコードから数行省略?)でもOKですので何卒よろしくお願いいたします。(レアケースなので使い分けは全く問題なし) 8回目の改良になってしまい本当にすみません。 HohoPapaさんの想定外の低レベル(すでにお気づきかと思いますが・・)ですみません。 Sub GraphSauceChange7() Sheets("成績表").Select ActiveSheet.Unprotect Const MaxRows = 50 'データ範囲に指定する最大行数 Const ColNum1 = 4 '1つ目データ格納列 Const ColNum2 = 6 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 Dim GSh As Worksheet Dim DSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群1つ目範囲 Dim tgRange2 As Range 'データ群2つ目範囲 Dim tgRangeA As Range '上記合計範囲 Set GSh = ThisWorkbook.Sheets(ShNameGr) Set DSh = ThisWorkbook.Sheets(ShNameGD) ERow = DSh.Cells(DSh.Rows.Count, 1).End(xlUp).Row If ERow < MaxRows + SRowNum Then SRow = SRowNum Else SRow = ERow - MaxRows + 1 End If Set tgRange1 = _ Range(DSh.Cells(SRow, ColNum1), DSh.Cells(ERow, ColNum1)) Set tgRange2 = _ Range(DSh.Cells(SRow, ColNum2), DSh.Cells(ERow, ColNum2)) Set tgRangeA = Union(tgRange1, tgRange2) '結合 GSh.ChartObjects(1).Chart.SetSourceData Source:=tgRangeA 'セット GSh.ChartObjects(1).Chart.SeriesCollection(1).Name = _ DSh.Cells(KoumokuRow, ColNum1).Value GSh.ChartObjects(1).Chart.SeriesCollection(2).Name = _ DSh.Cells(KoumokuRow, ColNum2).Value End Sub

  • JSのコードで保存ができません

    以下のコードなのですがnameの部分だけ保存ができません なぜなのでしょうか <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name1="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, user-scalable=no"> <link rel="stylesheet" href="components/loader.css"> <script src="components/loader.js"></script> </head> <body> <table border="3" align="center" style=border-spacing:0px;> <tr> <th width="20" height="30">Day</th> <th width="80">name</th> <th width="70">in</th> <th width="100">out</th> <th width="100">total</th> </tr> <tr> <th><input type="text" id="day" style="width : 30px; height : 20px;"></th> <td><input type="text" id="name" style="width : 80px; height : 20px;"></td> <td><input type="text" id="in_m" style="width : 50px; height : 20px;"></td> <td><input type="text" id="out_m" style="width : 50px; height : 20px;"></td> <td><input type="text" id="total" style="width : 50px; height : 20px;"></td> </tr> </table> <script> //保存関係 var day = document.getElementById("day"); var name = document.getElementById("name"); var in_m = document.getElementById("in_m"); var out_m = document.getElementById("out_m"); var total = document.getElementById("total"); window.onload = function() { var body_day = localStorage.getItem("day"); var body_name = localStorage.getItem("name"); var body_in_m = localStorage.getItem("in_m"); var body_out_m = localStorage.getItem("out_m"); var body_total = localStorage.getItem("total"); if (body_day != null) day.value = body_day; if (body_name != null) name.value = body_name; if (body_in_m != null) in_m.value = body_in_m; if (body_out_m != null) out_m.value = body_out_m; if (body_total != null) total.value = body_total; } day.onchange = function() { localStorage.setItem("day",day.value); } name.onchange = function() { localStorage.setItem("name",name.value); } in_m.onchange = function() { localStorage.setItem("in_m",in_m.value); } out_m.onchange = function() { localStorage.setItem("out_m",out_m.value); } total.onchange = function() { localStorage.setItem("total",total.value); } </script> </body> </html>

専門家に質問してみよう