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

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

ただいまの
回答率

88.57%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,706

TD0

score 22

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

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

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

function myFunction() {
  var sh = SpreadsheetApp.getActiveSheet();
  var url = sh.getRange("C2").getValue(); //C2には記事のURLが記載。
  var data = UrlFetchApp.fetch(url)
  var text = data.getContentText();

  var ary = text.split('<h1>'); //配列ary[1]に文章データより以下が含まれている。
  var contents = ary[1].split('<p>'); // それを段落ごとに切り分ける   
  var parenthesis = contents.toString().replace(/<.*?>/g,'')//一度文字列に変換してカッコを除く
  var conpare = parenthesis.split(/\r\n|\r|\n/) //改行を頼りに再度配列に戻す

  Logger.log(conpare)

for (var i = 0; i < count-5; i++) {
   var de = sh.getRange(i + 4, 1);
   de.setValue(conpare[i])
}
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

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

// サンプルコード
function myFunction() {
  var sh = SpreadsheetApp.getActiveSheet();
  var url = sh.getRange("C2").getValue(); //C2には記事のURLが記載。

  const content = UrlFetchApp.fetch(url).getContentText();
  const $ = Cheerio.load(content);

  // 見出しを表示
  Logger.log($('h1').text());

  // 段落ごとに表示
  $('p').each(function(){
    Logger.log($(this).text());
  });

  // リンク一覧を表示
  $('a').each(function(){
    Logger.log($(this).attr('href'));
  });
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/17 22:03

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

    キャンセル

checkベストアンサー

+1

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

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/17 22:02

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

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る