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

実現したいこと

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');
}

コメントを投稿

0 コメント