質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

2回答

722閲覧

現在書いているコードを短縮してシンプルにする方法を教えてください

aaiaka

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

1グッド

3クリップ

投稿2024/04/14 05:01

編集2024/04/14 08:15

実現したいこと

現在書いているコードを短縮してシンプルにしたい

詳細

よろしくお願いいたします。

GAS

1 2function myFunction() { 3 4 5//HTMLを取得 6 const url = "URL"; 7 const response = UrlFetchApp.fetch(url); 8 const html = response.getContentText("UTF-8") 9 10//テーブルデータを取得 11 const tabledatas = Parser.data(html).from('<tbody>').to("</tbody>").build(); 12 13 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東G) 14 let tabledata1 = Parser.data(tabledatas).from('<td>東G</td>').to('</td>').iterate(); 15 16 17 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東S) 18 let tabledata2 = Parser.data(tabledatas).from('<td>東S</td>').to('</td>').iterate(); 19 20 21 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東P) 22 let tabledata3 = Parser.data(tabledatas).from('<td>東P</td>').to('</td>').iterate(); 23 24 25 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東2) 26 let tabledata4 = Parser.data(tabledatas).from('<td>東2</td>').to('</td>').iterate(); 27 28 29 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東1) 30 let tabledata5 = Parser.data(tabledatas).from('<td>東1</td>').to('</td>').iterate(); 31 32 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(JQ) 33 let tabledata6 = Parser.data(tabledatas).from('<td>JQ</td>').to('</td>').iterate(); 34 35 36 //テーブルデータから特定の文字列に囲まれたデータをすべて抽出.iterate();(東マ) 37 let tabledata7 = Parser.data(tabledatas).from('<td>東マ</td>').to('</td>').iterate(); 38 39 40 41//スプシのデータ取得 42 const spreadFile = SpreadsheetApp.getActiveSpreadsheet(); 43 44//スプシのシート名を指定してデータ取得 45 const spreadSheet = spreadFile.getSheetByName("シート1"); 46 47let tabledata11,tabledata22,tabledata33,tabledata44,tabledata55,tabledata66,tabledata77 48 49//すべてのテーブルデータをスプシに記入 50 51 //テーブルデータ(東G)をスプシに記入 52 for (let i = 0; i < tabledata1.length; i++) { 53 54 //抽出した無駄な部分を削除 55 tabledata11 =tabledata1[i].replace("<td>",""); 56 tabledata11 =tabledata1[i].replace(/[\s\t\n]/g,""); 57 tabledata11 = tabledata1[i].replace("<td>", ""); 58 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata11]]) 59 60 } 61 62 63 //テーブルデータ((東S))をスプシに記入 64 for(let i=0;i<tabledata2.length;i++){ 65 66 //抽出した無駄な部分を削除 67 tabledata22 =tabledata2[i].replace("<td>",""); 68 tabledata22 =tabledata2[i].replace(/[\s\t\n]/g,""); 69 tabledata22 = tabledata2[i].replace("<td>", ""); 70 71 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata22]]) 72 } 73 74 75 76 //テーブルデータ((東P))をスプシに記入 77 for(let i=0;i<tabledata3.length;i++){ 78 79 //抽出した無駄な部分を削除 80 tabledata33 =tabledata3[i].replace("<td>",""); 81 tabledata33 =tabledata3[i].replace(/[\s\t\n]/g,""); 82 tabledata33 = tabledata3[i].replace("<td>", ""); 83 84 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata33]]) 85 86 } 87 88 89 90 //テーブルデータ((東2))をスプシに記入 91 for(let i=0;i<tabledata4.length;i++){ 92 93 //抽出した無駄な部分を削除 94 tabledata44 =tabledata4[i].replace("<td>",""); 95 tabledata44 =tabledata4[i].replace(/[\s\t\n]/g,""); 96 tabledata44 = tabledata4[i].replace("<td>", ""); 97 98 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata44]]) 99 } 100 101 102 //テーブルデータ((東1))をスプシに記入 103 for(let i=0;i<tabledata5.length;i++){ 104 105 //抽出した無駄な部分を削除 106 tabledata55 =tabledata5[i].replace("<td>",""); 107 tabledata55 =tabledata5[i].replace(/[\s\t\n]/g,""); 108 tabledata55 = tabledata5[i].replace("<td>", ""); 109 110 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata55]]) 111 112 } 113 114 //テーブルデータ((JQ))をスプシに記入 115 for(let i=0;i<tabledata6.length;i++){ 116 117 //抽出した無駄な部分を削除 118 tabledata66 =tabledata6[i].replace("<td>",""); 119 tabledata66 =tabledata6[i].replace(/[\s\t\n]/g,""); 120 tabledata66 = tabledata6[i].replace("<td>", ""); 121 122 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata6[i]]]) 123 } 124 125 //テーブルデータ((東マ))をスプシに記入 126 //for(i of tabledata7){ 127 //spreadSheet.appendRow([tabledata7[i]]); 128 for(let i=0;i<tabledata7.length;i++){ 129 130 //抽出した無駄な部分を削除 131 tabledata77 =tabledata7[i].replace("<td>",""); 132 tabledata77 =tabledata7[i].replace(/[\s\t\n]/g,""); 133 tabledata77 = tabledata7[i].replace("<td>", ""); 134 135 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[tabledata77]]) 136 137 138} 139 140}
TN8001😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaiaka

2024/04/14 06:32

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
ikedas

2024/04/14 06:35

現在書いているコードを短縮してシンプルにするために、自分でやってみたことを記してください。また、その結果自分が想定した通りにならなかったのであれば、どうなることを想定していて実際はどうなったのかを記してください。 ちなみに、このコメント欄に書くのではありません。質問文を編集して書いてください。
TN8001

2024/04/14 06:35

対応ありがとうございます^^
codemaker

2024/04/14 06:42

5行目、12行目、20行目はfor(... in ...)ではないのですか?
int32_t

2024/04/14 07:29

tabledata1 から tabledata7 を用意する方法から改善したほうがいいと思います。そのあたりのコードも開示してはどうでしょうか。
aaiaka

2024/04/14 08:16

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
codemaker

2024/04/14 10:03 編集

for (... of ...) { for (... in ...) { は for ( ; ; ) { だったの?
codemaker

2024/04/14 10:31

というか、 for of 文をご存知で使わないのは何故ですか? テーブルデータとシート記入と二重にfor文を使えるのはご存知ですよね。
ikedas

2024/04/14 11:12

というか、質問者さん自身がコードをいろいろ書き換えて試していらっしゃるようなんで、 > 現在書いているコードを短縮してシンプルにするために、自分でやってみたことを記してください。また、その結果自分が想定した通りにならなかったのであれば、どうなることを想定していて実際はどうなったのかを記してください。 という私の問いかけにも反応をいただきたいです。 ちなみに (繰り返しになりますが)、このコメント欄に書くのではありません。質問文を編集して書いてください。
codemaker

2024/04/14 11:18 編集

えっと、よくわかりませんが、質問者さんは質問を楽しんでいて回答は望んでいない(自分で回答を見つけたい)ということですか?
ikedas

2024/04/14 11:21 編集

私個人の印象としては、質問の動機とか自分が試したこととかを示さず、ただ答えだけを求める質問のしかたはよろしくないなーと思いますね。
codemaker

2024/04/14 11:31

コードが同じことの繰り返しで重複しているのを まとめて書く方法を知りたいだけかと思っていました。 なので配列でのfor文の使い方を知っているようなので、重ねて組み合わせればいいだけかと。 動機や何を試したのかは、私は関心がありませんでした。
ikedas

2024/04/14 11:44

まあそういうことなんでしょうが、それにしてもいろいろやりかたはあるわけで、例えば「東G」とかいった部署名? なんですかね、これをパラメータ化してまとめるとか、他のやりかたとかあると思います。そういったことを何か**試した上で質問**してきているのではないのなら、本当にやりたいの? ということです。 一方、現場の感覚で言うと、ちゃんと動いてるものなら強いて単純化しようとしてバグを入れたらまずいので、そのままがいいという判断もありうるわけですよね。だから、あえてそういうことを**しようと思った動機** (たとえば「上長に指示されたから」でもいいので) を知りたいというのはあります。
codemaker

2024/04/14 11:58

動機しだいで(上からの指示なら)バクありでもいいと仰りたいように聞こえますよ。
ikedas

2024/04/14 12:02

上長の指示の結果バグを作り込んでしまったら、それは上長の判断ミスです。会社勤めというのはそういうものです。ていうか何の話だ。
codemaker

2024/04/14 12:10 編集

変な話になって、ごめんなさい。 ただ、 > 上長の指示の結果バグを作り込んでしまったら、それは上長の判断ミスです。 というのを責任転嫁というのではないかなぁと...一瞬思ってしまいました。 ごめんなさい。 上はどんなときにでも責任は負うものですね。
ikedas

2024/04/14 12:14 編集

上長が「お前が勝手にバグを入れたんだ」と言ったら責任転嫁です。 組織の中で上司からの指示に従って仕事をしたのに問題が生じたら、責任を取るのは組織であって、個人ではありません。そうでなきゃ誰も、会社で上司の指示に従ったりしませんでしょ。 なんか変な話になっちゃいましたね、こちらこそ失礼。
aaiaka

2024/04/14 12:18

for of 文をご存知で使わないのは何故ですか? >昨日から初めてまだ初学者のため、for ofよりfor文が自分ではコードの理解がしやすいためです。 gasでしたいことは、とあるサイトの表から特定の情報をスクレイピングすることです。 よろしくお願いいたします。
aaiaka

2024/04/14 12:21

//すべてのテーブルデータをスプシに記入 これ以降のコードを短縮できそうと思っているのですが、短縮できるアイデアがありません。 どなたかアイデアありましたら教えていただけますと幸いです。
ikedas

2024/04/14 12:26

なぜ短縮したいのでしょうか。別に今のままでも動くのだから問題ないではありませんか。 また、for文の3種類の構文を知っているくらいですから、短縮のために何か試してみたことがあるのではないですか。それを説明してください。
aaiaka

2024/04/14 12:28

なぜ短縮したいのでしょうか。 >短縮した方が気持ち良いしかっこよくないですか?スキルアップのためでもあります。 この気持ちに共感していただけないでしょうか。
aaiaka

2024/04/14 12:29

短縮のために何か試してみたことがあるのではないですか。それを説明してください。 >特にありません。ただ単に短縮したコードを書いてみたいです。
ikedas

2024/04/14 12:30

スキルアップのためなら、ご自分で勉強されるのが一番です。参考書を読むなりして、短縮できるテクニックがないか調べましょう。
aaiaka

2024/04/14 12:31

短縮できるかどうか調べて、私の方でも試したのですができませんでした、、
aaiaka

2024/04/14 12:34

答え探すより人に聞いた方が効率良くないですか? もちろん、いろいろ寄り道して思考を辿ることが重要なときもありますが、プログラミングは答え見て覚えた方が上達速度早いと思っています。 私は間違っていますでしょうか。玄人の方の意見を聞かせていただけますか。
ikedas

2024/04/14 12:40 編集

ですから、試したことを書いてくださいと言っています。 teratailでは、自分で問題に取り組まずに単に正解を要求するような「**丸投げの質問**」は推奨されていません。 https://teratail.com/help/avoid-asking 回答を得たいのであれば、「私の方でも試したのですができませんでした」と言うのではなく、 > 現在書いているコードを短縮してシンプルにするために、自分でやってみたことを記してください。また、その結果自分が想定した通りにならなかったのであれば、どうなることを想定していて実際はどうなったのかを記してください。 --- 流石にこれだけ言えば、普通は対応すると思うのですが。しないとしたら、最初から回答を求めていない質問の可能性が出てきますね。
hentaiman

2024/04/14 13:09 編集

掲載コードから見て取れる事はforを知っていてあえて使わないことを選んだという事、関数も知っていそうだがそれもあえて使わないことを選んだのだろうという事だけです。 ならばこれ以上改善の余地はないです。これがもしforが一切書かれていないコードだったらforがありますよって教える事はできます。 > プログラミングは答え見て覚えた方が上達速度早いと思っています。 この程度なら試行錯誤考えた方がスキルアップになりそうです。 見て覚えた方が良いレベルの内容は大体書籍になっていたりするものだし、その難易度が高いものならライブラリ化されていたりします。
codemaker

2024/04/14 13:25

ここまでのやり取りを読む前は、 単純にコードの文字数を少なくしたいだけかと思っていて、 なぜ質問者さんが自分で書いているのにわかっていないかと疑問でした。 何がどうなっているのかを理解できなくても、 それを使ったコードを書いてみたかったのですね。 わからなくてもいいから動くコードを欲しいのであれば、 あえて初学者には理解できないように書いたコードでもいいのでしょうか。
ikedas

2024/04/14 13:31

> あえて初学者には理解できないように書いたコード そういうコードゴルフ的なことをするのは楽しいので、奇抜なコードを回答として投稿されるのもよいと思いますよ☺️
codemaker

2024/04/14 13:32

> 答え探すより人に聞いた方が効率良くないですか? > もちろん、いろいろ寄り道して思考を辿ることが重要なときもありますが、プログラミングは答え見て覚えた方が上達速度早いと思っています。 と仰ってますが、 ご自身で提示したコード自体からいろいろ(今回の質問が不要なほど)覚えられるのになぁと思ってしまいました。
codemaker

2024/04/14 13:41

> for of 文をご存知で使わないのは何故ですか? > >昨日から初めてまだ初学者のため、for ofよりfor文が自分ではコードの理解がしやすいためです。 コードがわかりにくくなる for ( ; ; ) 文を使うのは イテレータが必要でなおかつ途中でbreakしたい時ですね。 配列ならsomeメソッドで置き換えできる可能性もありますが。
ikedas

2024/04/14 13:49

質問者さんからのレスポンスがなくなりましたが、明日の午前中まで待ってみます。
aaiaka

2024/04/14 14:02

あえて初学者には理解できないように書いたコードでもいいのでしょうか。 >もし短縮できるものがあるなら見てみたいです!色々勉強させてください。
ikedas

2024/04/14 14:08

> 現在書いているコードを短縮してシンプルにするために、自分でやってみたことを記してください。また、その結果自分が想定した通りにならなかったのであれば、どうなることを想定していて実際はどうなったのかを記してください。 がんば!
YellowGreen

2024/04/14 15:01 編集

> >もし短縮できるものがあるなら見てみたいです! > 色々勉強させてください。 まずは、 ご自身で書いたコードを勉強するなり、 これまでの試行錯誤を書いてみましょう。 という話の流れになっていますよ。
guest

回答2

0

tabledataN を配列化すれば以下のように書けると思います。

js

1 // テーブルデータから特定の文字列に囲まれたデータをすべて抽出 2 const tabledata = ['東G', '東S', '東P', '東2', '東1', 'JQ', '東マ']. 3 map(e => Parser.data(tabledatas).from(`<td>${e}</td>`).to('</td>').iterate()); 4 ... 5 // テーブルデータをシートに記入 6 for (let data of tabledata) { 7 for (let d of data) { 8 d = d.replace(....); 9 spreadSheet.getRange(spreadSheet.getLastRow()+1,2).setValues([[d]]); 10 } 11 }

投稿2024/04/14 21:49

int32_t

総合スコア21074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int32_t様のコードを1文にすると、これでも動作しますよ。

js

1 ['東G', '東S', '東P', '東2', '東1', 'JQ', '東マ'] 2 .map(e => Parser.data(tabledatas).from(`<td>${e}</td>`).to('</td>').iterate()) 3 .forEach(data => data.forEach(d => spreadSheet.getRange(spreadSheet.getLastRow() + 1, 2) 4 .setValue(d.replace("<td>","").replace(/[\s\t\n]/g,"").replace("<td>", ""))));

投稿2024/04/16 00:42

codemaker

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問