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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

2回答

835閲覧

配列内の指定区間文字を置換する方法

TD0

総合スコア22

Google Apps Script

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

0グッド

0クリップ

投稿2018/11/14 11:07

お世話になっております。

毎日更新されるブログ記事を、1段落1セルに記述するgasを書いています。
記事内で盛んに a hrefが使われる文章のため、"<>"の間に含まれている文字を取り除いてから出力したいと考えました。
下のコードは機能しているのですが、配列内部のデータを直接いじることはできませんか?
それとも配列は箱のようなイメージで、それにデータを入れる前、出した後に処理しなければならないのでしょうか。

どうぞよろしくお願いします。

GoogleAppsScript

1function myFunction() { 2 var sh = SpreadsheetApp.getActiveSheet(); 3 var url = sh.getRange("C2").getValue(); //C2には記事のURLが記載。 4 var data = UrlFetchApp.fetch(url) 5 var text = data.getContentText(); 6 7 var ary = text.split('<h1>'); //配列ary[1]に文章データより以下が含まれている。 8 var contents = ary[1].split('<p>'); // それを段落ごとに切り分ける 9 var parenthesis = contents.toString().replace(/<.*?>/g,'')//一度文字列に変換してカッコを除く 10 var conpare = parenthesis.split(/\r\n|\r|\n/) //改行を頼りに再度配列に戻す 11 12 Logger.log(conpare) 13 14for (var i = 0; i < count-5; i++) { 15 var de = sh.getRange(i + 4, 1); 16 de.setValue(conpare[i]) 17} 18}

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

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

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

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

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

guest

回答2

0

cheerioというライブラリを使えば jQueryっぽい DOM操作が可能です。

cheerio for Google Apps Script をライブラリに追加してください。
Script ID:1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0

詳しい使い方は本家の公式ドキュメントを参照してください。

GAS

1// サンプルコード 2function myFunction() { 3 var sh = SpreadsheetApp.getActiveSheet(); 4 var url = sh.getRange("C2").getValue(); //C2には記事のURLが記載。 5 6 const content = UrlFetchApp.fetch(url).getContentText(); 7 const $ = Cheerio.load(content); 8 9 // 見出しを表示 10 Logger.log($('h1').text()); 11 12 // 段落ごとに表示 13 $('p').each(function(){ 14 Logger.log($(this).text()); 15 }); 16 17 // リンク一覧を表示 18 $('a').each(function(){ 19 Logger.log($(this).attr('href')); 20 }); 21}

投稿2018/11/15 05:24

編集2018/11/16 00:40
shozi3

総合スコア691

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

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

TD0

2018/11/17 13:03

ありがとうございます、大変参考になりました。
guest

0

ベストアンサー

Array.prototype.mapを使うか、分からなければforで処理すればよいのでは?

javascript

1var content = []; 2for(var i = 0; i < content.length; i++) { 3 content[i] = content[i].replace(/<.*?>/g, ''); 4}

ただ、これで済むならjavascriptで、gasのタグの意味がないです。↓このようにXmlServiceを使えばpタグのみ、アンカータグのhref属性を無視して取得できます。

javascript

1 const xml = "<html><body><h1>a</h1><p>a<a href='http'>link</a></p><p>b</p></body></html>"; 2 const doc = XmlService.parse(xml); 3 const desc = doc.getDescendants(); 4 var dat = []; 5 for(var i = 0; i < desc.length; i++) { 6 var elm = desc[i].asElement(); 7 if(elm != null && elm.getName() == 'p') {dat.push(elm.getValue());} 8 }

ただ、これが動くにはhtmlがxmlとして正しく定義されている必要があります(タグがきちんと対応しているなど)が…

投稿2018/11/14 13:31

編集2018/11/15 01:31
papinianus

総合スコア12705

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

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

TD0

2018/11/17 13:02

お返事遅くなりました。 XMLというもの、parseメソッドをご提示いただいて、 恥ずかしながら改めて勉強するいい機会になりました。 (htmlと違いをきちんと理解していませんでした。) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問