質問するログイン新規登録

Q&A

解決済

1回答

604閲覧

Googleアラートからslackで取得した投稿内容を、スプレッドシートにGASを使用して転記したい。

poh-0402

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

1クリップ

投稿2023/12/13 08:25

0

1

実現したいこと

slackの投稿内容をスプレッドシートにGASを使用して転記したい。

前提

googleアラートをslackのrssに設定して、最新のニュースを受信したらslackに投稿し、投稿された内容をスプレッドシートに転記するツールを作成しています。

slackからシートへの転記は、slackのOutgoing Webhookを使用しております。

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

googleアラートから同時に複数のアラートを受信した場合、全て転記されません。

例えば写真のように15:15に複数受信します。
イメージ説明

しかし、シートには全ての投稿が転記されず、バラバラに転記されます。
最初の1件と最後の1件のみなど規則性は見つけられませんでした。
イメージ説明

2件以上投稿された場合のみ、正しく転記がされないようです。
当方ITの知識が浅く、チャットgptやGoogleで調べて見様見真似で実施しているため、どこを修正したら良いのか検討がつきません。

複数行でもシートに転記できるよう、どなたか助言頂けないでしょうか。

該当のソースコード

function doPost(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("転記");

var sheetLastRow = sheet.getLastRow();
var time = new Date(e.parameter.timestamp * 1000);
var username = e.parameter.user_name; // 投稿者のユーザー名を取得
var postText = e.parameter.text; // 投稿内容を取得

// slackbot以外の場合はユーザー名をそのまま使用
if (username !== 'slackbot') {
setUsername(username);
} else {
// slackbotの場合は特定の単語が含まれているかをチェックし、投稿者名を設定
setUsernameFromPostText(postText);
}

// 正規表現で < で始まり > で終わる文を抽出
var urlMatch = postText.match(/<[^>]*>/g);

// URL を取り除く
var body = postText.replace(/<[^>]*>/g, '').trim();

// URL を抽出
var url = urlMatch ? urlMatch.map(match => match.replace(/<|>/g, '')).join('') : '';

// URL からさらにURLを抽出
var extractedUrlMatch = url.match(/url=([^&]+)/);
var extractedUrl = extractedUrlMatch ? extractedUrlMatch[1] : '';

// クエリ文字列を正確に抽出し、デコードする
var decodedUrl = extractQueryParams(extractedUrl);

// 投稿日と投稿時間を分けて転記
sheet.getRange(sheetLastRow + 1, 1).setValue(formatDate(time)); // 投稿日
sheet.getRange(sheetLastRow + 1, 2).setValue(time.toLocaleTimeString()); // 投稿時間
sheet.getRange(sheetLastRow + 1, 4).setValue(body);
sheet.getRange(sheetLastRow + 1, 5).setValue(decodedUrl);
}

// クエリ文字列を正確に抽出し、デコードする関数
function extractQueryParams(url) {
// URLをデコード
var decodedUrl = decodeURIComponent(url);

// クエリ文字列を正確に抽出
var queryStringMatch = decodedUrl.match(/?(.*)/);

// クエリ文字列が見つかった場合、抽出しデコード
var queryString = queryStringMatch ? queryStringMatch[1] : '';
var decodedQueryString = decodeURIComponent(queryString);

// 正しい形のURLを組み立て
var finalUrl = decodedUrl.replace(queryString, decodedQueryString);

return finalUrl;
}

// 日付をカスタムフォーマットに変換する関数
function formatDate(date) {
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
return year + '/' + month + '/' + day;
}

// 投稿者名を設定する関数(slackbot以外の場合)
function setUsername(username) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("転記");

var sheetLastRow = sheet.getLastRow();

// 投稿者名を設定
sheet.getRange(sheetLastRow + 1, 3).setValue(username);
}

// 投稿者名を設定する関数(slackbotの場合)
function setUsernameFromPostText(postText) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("転記");

var sheetLastRow = sheet.getLastRow();

// 投稿者名を特定の単語が含まれているかをチェックし設定
var alertWords = ['SaaS', '労働基準法','労働安全衛生法'];

for (var i = 0; i < alertWords.length; i++) {
// alertWords[i]がpostText内に含まれている場合に投稿者名を設定
if (postText.includes(alertWords[i])) {
sheet.getRange(sheetLastRow + 1, 3).setValue('Google Alert - ' + alertWords[i]);
return;
}
}

// 一致する単語がない場合はslackbotを使用
sheet.getRange(sheetLastRow + 1, 3).setValue('slackbot');
}

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

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

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

guest

回答1

0

自己解決

gmailからスプレッドシートへ転記、転記された内容をslackに投稿でやりたい処理が実行できました。

投稿2023/12/14 08:52

poh-0402

総合スコア1

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問