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

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

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

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

1回答

2010閲覧

GASでFor文の入れ子がうまくいかない

marshmallowmash

総合スコア7

Google Apps Script

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

0クリップ

投稿2017/11/01 09:51

編集2017/11/01 09:53

普段はプログラミングとは全然関係のない仕事をしています。
調べながらGASを書いてみたのですが、うまくいきません。
下記、ヒントをいただけますと幸いです。

###前提・実現したいこと
RSSの内容を、ChatWorkに流したいと思っています。

  • RSSは複数URLあり、下記のようにA列にURL、B列にサイト名の形でGoogleスプレッドシートに入っている。
AB
RSSのURL1サイト名1
RSSのURL2サイト名2
  • GASを使ってChatWorkに流したい

  • 最終的なアウトプットは、下記を目指している


<サイト名1>
ページタイトル1-1
URL1-1

ページタイトル1-2
URL1-2

<サイト名2>
ページタイトル2-1
URL2-1

ページタイトル2-2
URL2-2


  • チャットワークと連携するためには、下記のGASライブラリを使用

https://github.com/cw-shibuya/chatwork-client-gas

###発生している問題・エラーメッセージ

現在、出力はできているのですが、最終的に目指している形になっていません。
下記のように、1つ目のRSSのサイト名のみ出てきます。


<サイト名1>
ページタイトル1-1
URL1-1

ページタイトル1-2
URL1-2

ページタイトル2-1
URL2-1

ページタイトル2-2
URL2-2


また、RSSを直に見たときと、チャットワークにはき出されるURLの数も違います。

###該当のソースコード

IDやトークンなどは念のためxxxxxで伏字にしております。

function sendNewsToChatwork() { //現在のスプレッドシートを取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //現在のシートを取得 var sheet = spreadsheet.getActiveSheet(); //最後の行を取得 var rowSheet=sheet.getDataRange().getLastRow(); //チャットワークトークン var client = ChatWorkClient.factory({token:'xxxxxxxxxxxxxxxx'}); //投稿するチャットルームのID var room_id = xxxxxxxx; //フィードからデータを取得 for( var i=1;i<=rowSheet;i++ ) { //RSSのURL一覧が入っているセルを取得 var range = sheet.getRange(i,1).getValue(); //GoogleアラートのRSSフィード var feedURL = range; //サイト名取得 var sitetitle = sheet.getRange(i,2).getValue(); //サイト名を流す // client.sendMessage({room_id: room_id, body: "<" + sitetitle + ">"}); var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var document = XmlService.parse(UrlFetchApp.fetch(feedURL).getContentText()); var items = document.getRootElement().getChildren('entry', atom); //取得した件数分チャットワークへ投稿 for(var j = 0; j < items.length; j++) { //サイトのURLを取得 var link = items[j].getChild('link', atom).getAttribute('href').getValue(); //サイトのタイトルを取得 var title = items[j].getChild('title', atom).getText(); //URLとタイトルを連結 if (j == 0){ var message = "<" + sitetitle + ">" + "\n" +  title + "\n" + link; }else{  var message = title + "\n" + link; } } //HTMLタグを除去してチャットワークへ投稿 client.sendMessage({room_id: room_id, body: message.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'')}); } /*//テスト投稿 client.sendMessage({room_id: room_id, body: range});*/ }

###試したこと
現在【URLとタイトルを連結】の箇所に入っているサイト名をはき出す部分を【サイト名取得】の下にコメントアウトしてある部分を使って別にしてみたところ、下記のようにそれぞれのRSSの一つ目のURLのみ出るようになりました。


<サイト名1>
ページタイトル1-1
URL1-1

<サイト名2>
ページタイトル2-1
URL2-1


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

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

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

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

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

guest

回答1

0

ベストアンサー

普段はプログラミングとは関係無いお仕事に従事されつつも、業務改善の為に自らプログラミングをされる姿勢、感じ入った次第です。少しでも助けになればと思い、コードと動作を確認させていただきました。

何点か問題が見受けられました。ただ、質問者様が利用されているRSS/AtomフィードのURLが分からなかった為、こちらで適当なフィードを試した結果ですのでその点はご承知置きください。

まず始めに、

JavaScript

1 //URLとタイトルを連結 2 if (j == 0){ 3 var message = "<" + sitetitle + ">" + "\n" +  title + "\n" + link; 4 }else{  5 var message = title + "\n" + link; 6 } 7 8 //HTMLタグを除去してチャットワークへ投稿 9 client.sendMessage({room_id: room_id, body: message.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'')}); 10

で、message 変数の宣言に問題があり、未初期化のmessage変数を
client.sendMessage({room_id: room_id, body: 省略
で使用するかたちになり停まってしまっていたケースがありました。また、ループ内でmesseageに適切に連結できていないように見受けられましたので、これも修正の必要があるように思いました。

次に、「1つ目のRSSサイトしか出ていかない」原因ですが、以下のコード
document = XmlService.parse(UrlFetchApp.fetch(feedURL).getContentText());
で受信するフィードの内容がXMLとして不完全で、JavaScriptの例外(Exception/要はエラー)が発生してしまい、その内容が処理されずにスキップ〜ChatWorkに送信する前に強制終了してしまうケースがありました。フィードの内容(XML)が不完全なのはコンテンツ提供側の問題なので、こちらではどうしようも無いと思います。これも

RSSを直に見たときと、チャットワークにはき出されるURLの数も違います。

の原因のひとつかと考えられます。上記を踏まえて修正、確認してみたコードが以下になります。

JavaScript

1function sendNewsToChatwork3() { 2 3 //現在のスプレッドシートを取得 4 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 5 //現在のシートを取得 6 var sheet = spreadsheet.getActiveSheet(); 7 //最後の行を取得 8 var rowSheet = sheet.getDataRange().getLastRow(); 9 10 //チャットワークトークン 11 var client = ChatWorkClient.factory({ token: '----------------' }); 12 //投稿するチャットルームのID 13 var room_id = '--------'; 14 15 //フィードからデータを取得 16 for (var i = 1; i <= rowSheet; i++) { 17 //RSSのURL一覧が入っているセルを取得 18 var range = sheet.getRange(i, 1).getValue(); 19 //GoogleアラートのRSSフィード 20 var feedURL = range; 21 //サイト名取得 22 var sitetitle = sheet.getRange(i, 2).getValue(); 23 //サイト名を流す 24 // client.sendMessage({room_id: room_id, body: "<" + sitetitle + ">"}); 25 26 try { 27 var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); 28 var content = UrlFetchApp.fetch(feedURL).getContentText(); 29 30 // XmlService.parseで不正なXMLの為に例外が起きるケース有り。 31 var document = XmlService.parse(content); 32 var items = document.getRootElement().getChildren('entry', atom); 33 34 // サイト名をあらかじめセットしておく 35 var message = "<" + sitetitle + ">"; 36 //取得した件数分チャットワークへ投稿 37 for (var j = 0; j < items.length; j++) { 38 //サイトのURLを取得 39 var link = items[j].getChild('link', atom).getAttribute('href').getValue(); 40 //サイトのタイトルを取得 41 var title = items[j].getChild('title', atom).getText(); 42 //タイトルとURLを連結 43 message += "\n" + title + "\n" + link; 44 } 45 46 //HTMLタグを除去してチャットワークへ投稿 47 message = message.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ''); 48 client.sendMessage({ room_id: room_id, body: message }); 49 } catch (e) { 50 // XMLのパースが失敗した場合、例外 51 Logger.log("excepton: " + e); 52 } 53 } 54}

完全に質問者様の要望通りの送信内容になっているかは分かりませんが、よろしければお試しください。完成までもう少しだと思いますので、もう一息がんばってください。

投稿2017/11/01 16:19

編集2017/11/02 02:15
dodox86

総合スコア9181

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

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

marshmallowmash

2017/11/02 02:08

ご回答ありがとうございます。 いただいたコードを試してみたところ、考えていた通りの投稿になりました! ありがとうございました。 理解できていない部分はもう少し調べて自分のものにしたいと思います。
dodox86

2017/11/02 02:13

早速お試しいただいたこと、並びにご報告どうもありがとうございます。お役に立てて良かったです。発展させると色々と面白いことができそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問