LoginSignup
aichi-matsui1984
@aichi-matsui1984

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASを使ってSLACKへ複数画像をアップロードしたい!

解決したいこと

GASを使ってSLACKへ複数画像をアップロードしたい!
Googleフォームで修繕現場などの調査結果報告フォームを作成しました。
SLACKに案件内容を集中管理しているため、フォームからPOSTされた画像や調査内容を該当スレッドにアップしたいです。

発生している問題

サポートにアドバイスもらったんですがよくわからなくて...
ループさせて画像1枚ずつ送ることは成功しています。

以下、現在のSRC

const LINE_FEED = "\n";

function huckSubmitForm(e) {
  //POSTデータの取得
  const thisResponse = (e !== undefined) ? e.response : FormApp.getActiveForm().getResponses().slice(-1)[0]; 
  const emailOfRespondent = thisResponse.getRespondentEmail();
  var txtReportMsg = "投稿者:" + emailOfRespondent + LINE_FEED;
  //POSTデータを投稿用に加工
  var itemDatas = setResponseItemDatasBase_(thisResponse, txtReportMsg);
  //SLACKへ投稿
  sendToSlack(itemDatas);
}
//POSTデータを投稿用に加工
function setResponseItemDatasBase_(response, txtReportMsg) {
  var itemDatas = {};
  const responseItems = response.getItemResponses();

  for (var c=0; c<100; c++) {
    var formData = responseItems[c];
    if(!formData)break;
    var title = formData.getItem().getTitle();
    var value = formData.getResponse();
  
    switch(title){
      case "調査日付":
        itemDatas.reportDate = value;
        if(value)txtReportMsg = txtReportMsg + "調査日付:" + value + LINE_FEED;
        break;
      case "調査説明":
        itemDatas.setumei = value;
        if(value)txtReportMsg = txtReportMsg + "調査説明:" + value + LINE_FEED;
        break;
      case "SLACK_URL":
        itemDatas.slackURL = value;
        itemDatas.msgID = getMrssageIDFromSlackUrl_(value);
        break;
      case "調査資料":
        itemDatas.filesBlob = getFileBlobs(value);
        break;
    }
  }
  return itemDatas;
}
function getMrssageIDFromSlackUrl_(slackURL) {
  var msgID = "";
  const REGEX_SLACK_MSG_ID = /.*\//g;
  if(slackURL){
    msgID = slackURL.replace(REGEX_SLACK_MSG_ID, "");
  }
  return msgID;
}

function getFileBlobs(fileIds) {
  var c = 1;
  var blobs = [];
  for (var fileId of fileIds) {
    var file = DriveApp.getFileById(fileId);
    file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
    blobs.push(file.getBlob());
  }
  return blobs;
}
//SLACKへ投稿
function sendToSlack(itemDatas) {
  const CHANNEL_ID = "投稿したいチャンネルID";
  const SLACK_TOKEN = "SLACKトークン";
  var REGEX_SLACK_TS_01 = /(?<=^.{11})(?=.)/;
  var REGEX_SLACK_TS_02 = /p/g;
  var msgID = itemDatas.msgID;
  var ts = msgID.replace(REGEX_SLACK_TS_01, ".").replace(REGEX_SLACK_TS_02, "");
  
  //メッセージ送信
  postMessageToSlack(ts, itemDatas.txtReportMsg, CHANNEL_ID, SLACK_TOKEN);
  //画像送信
  var title = "投稿タイトル";
  postImage(itemDatas.filesBlob, title, ts, CHANNEL_ID, SLACK_TOKEN);
}

//メッセージ送信
function postMessageToSlack(thread_ts, message, channelId, token) {
  var url = "https://slack.com/api/chat.postMessage";
  var payload = {
    "token" : token,
    "channel" : channelId,
    "text" : message
  };
  payload["thread_ts"] = thread_ts;
  var params = {
    "method" : "post",
    "payload" : payload
  };
  // Slackに投稿する
  const response = UrlFetchApp.fetch(url, params);
  JSON.parse(response.getContentText('utf-8'));
}

//SLACKに画像送信
function postImage(blobs, title, thread_ts, channelId, token) {
  var c = 1;
  for (var blob of blobs) {
    postImageToSlack(title + c, blob, thread_ts, channelId, token);
    c++;
  }
}

function postImageToSlack(title, blob, thread_ts, channelId, token) {
  var payload = {
    "title" : title,
    "token" : token,
    "channels" : channelId,
    'file' : blob,
    'thread_ts': thread_ts,
  };
  var options = {
    "method" : "post",
    "payload" : payload
  };

  var response = UrlFetchApp.fetch("https://slack.com/api/files.upload", options);
}

SLACKヘルプへ質問

上記SRC作成後、以下の内容で質問しSLACKヘルプからご返答いただいたのですがやり方がわかりませんでした。

(質問文)
複数のファイルをまとめて送りたいのですが、1ファイルずつ送信する形式しか見つけられませんでした。
こちら、複数ファイルを送信する場合はどうしたらよいでしょうか!?
(回答文)
本件お待たせしてすみませんでした!
 
files.getUploadURLExternal にてまずそれぞれのファイルの URL の取得をした後、その URL にファイルをアップロード (https://api.slack.com/methods/files.getUploadURLExternal) 
files.completeUploadExternal にて複数のファイルのアップロードを完了させる (https://api.slack.com/methods/files.completeUploadExternal)
 
上記で実行してみてできるかお試しいただけますか?
よろしくお願いします。

回答からいただいた参考サイトを見てみたのですが、Googleドライブにあるファイルだと拡張子付きURLが取得できないようで手詰まっています。
ご協力お願いいたします!

0

No Answers yet.

Your answer might help someone💌