LoginSignup
2
2

More than 3 years have passed since last update.

【入門】Google Apps Scriptチュートリアル(番外編・チャンネルの投稿内容を投稿の古い順からスプレッドシートに書き出す)

Last updated at Posted at 2019-05-11

社内でチャンネルの投稿内容を簡単に取れればなぁ~
という声が出たので、チュートリアル番外編としてサッと書き上げました(笑)。

もし、Google Apps Scriptをイチから勉強したいとお考えでしたら、チュートリアル1/2(前編)から読むことをお勧めします。

前編
【入門】Google Apps Scriptチュートリアル1/2(デモ動画付き・①doGet()とdoPost()でHellow World!)

後編
【入門】Google Apps Scriptチュートリアル2/2(デモ動画付き・②コマンドを叩いてチャンネル情報を表示させる)

チャンネルの投稿内容を取得し、スプレッドシートに書き出すスクリプトはチュートリアル1/2と2/2で取り上げたスクリプトと同様に、main関数を実行関数としました。
main関数を走らせると、以下のことが順々におこなわれます。

  • 定数(const aaa)や変数(var xxx)に値を入れる(Args)
  • スプレッドシートオブジェクトをシート単位で立ち上げる(InitialSetUp)
  • getSlackLog()でslack api methodとfetchを使ってチャンネルの投稿内容(channel.history)を取得し、変数messagesに代入
  • 取得したmessagesをsetSlackLog()でスプレッドシートに書き出す
    • このときtimestampはunix形式なので、moment.jsも使いながら、任意の形式に変換

実際のコードはこちらです。
本記事はチュートリアルといっても番外編なので、解説は簡単にさせていただきます。

書くの、疲れた。。

function main() {
    /*-------Args----------------------------------------------*/
    const SLACK_TEAM = "xxxxxx";  //<YOUR_SLACK_TEAM>
    const SLACK_TOKEN = "xoxp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    // cf. channel url = "https://<YOUR_SLACK_TEAM>.slack.com/messages/<YOUR_CHANNEL_ID>"";
    const CHANNEL_ID = "CFTS3H5AQ"; //<YOUR_CHANNEL_ID>
    const BASE_URL = "https://" + SLACK_TEAM + ".slack.com/api/channels.history?";
    const SHEET_NAME = "sheet1"; //<SheetName>
    const COLUMN_NUMBER_TIMESTAMP = 1;
    const COLUMN_NUMBER_USER = 2;
    const COLUMN_NUMBER_TEXT = 3;
    const COLUMN_NUMBER_LINK = 4;

    //スプレッドシートに書き出す投稿日時のフォーマット(年有り)
    var isYear = true;

    //スプレッドシートに書き出す投稿日時のフォーマット(年無し)
    //var isYear = false;


   //取得期間
    var period = 8;
    /*---------------------------------------------------------*/

    /*--------InitialSetUp--------------------------------------------------------------------------*/
    const SHEET = SpreadsheetApp.getActiveSpreadsheet()
        .getSheetByName(SHEET_NAME);
    var lastrow = SHEET.getLastRow();
    /*---------------------------------------------------------*/

    /*
    params = [
      SLACK_TOKEN, CHANNEL_ID, BASE_URL, period
    ];
    for ( var i = 0; i < params.length; i++ ) {
        Logger.log("typeof params[i]: %s", typeof params[i]);
    }
    return;
    */


    var messages = JSON.parse(
        getSlackLog(SLACK_TOKEN, CHANNEL_ID, BASE_URL, period)
    )
    .messages
    .reverse();

    if ( !messages ) {
        return;
    }
    //Logger.log(typeof messages);
    //return;

    /*
    params = [
      messages, SHEET, lastrow, COLUMN_NUMBER_TIMESTAMP, COLUMN_NUMBER_USER, COLUMN_NUMBER_TEXT, COLUMN_NUMBER_LINK
    ];
    for ( var i = 0; i < params.length; i++ ) {
        Logger.log("typeof params[i]: %s", typeof params[i]);
    }
    return;
    */

    setSlackLog(messages, SHEET, lastrow, 
                COLUMN_NUMBER_TIMESTAMP, COLUMN_NUMBER_USER, COLUMN_NUMBER_TEXT, COLUMN_NUMBER_LINK,
                timestampFormat, isYear);
}


/**
* setSlackLog Function
*
* properties in the objects/rows
* @param {string} token
* @param {string} id  
* @param {string} url
* @param {number} days 
*/
function getSlackLog(token, id, url, days) {
    var payload = {
      // Slack Token
      'token': token,
      // Channel ID
      'channel': id,
      // 24 Hours/day * 8 days
      'oldest': parseInt( new Date() / 1000 ) - (60 * 60 * 24 * days)
    }

    // URL Of Param 
    var params = [];
    for (var key in payload) {
        params.push(key + '=' + payload[key]);
    }
    var requestUrl = url + params.join('&');
    return UrlFetchApp.fetch(requestUrl)
}

/**
* setSlackLog Function
*
* properties in the objects/rows
* @param {object}  array            - JSON.parse(getSlackLog(SLACK_TOKEN, CHANNEL_ID, REQUEST_URL)).messages.reverse();
* @param {object}  sheetObj         - SHEET of Activaed SpreadsheetAppObj
* @param {number}  lastrow          - last row of sheet
* @param {number}  columnNumberTs   - 1
* @param {number}  columnNumberText - 2
* @param {number}  columnNumberLink - 3 
* @param {boolean} booleanValue     - true/false 
*   if "booleanValue" is true, the format of timestamp is "YYYY/MM/DD(ddd) HH:mm:ss"
*   if not, the format is "MM/DD(ddd) HH:mm:ss"
*/
function setSlackLog(array, sheetObj, lastrow, 
                    columnNumberTs, columnNumberUser, columnNumberText, 
                    columnNumberLink, booleanValue) {
    // Log messages on SpreadSheet
    for ( var i = 0; i < array.length; i++ ){
        /*
        Logger.log("array[i].user: %s", array[i].user);
        Logger.log(array[i].ts);
        Logger.log(typeof true);
        */

        // DateTime
        sheetObj.getRange(lastrow + i + 1, columnNumberTs)
            .setValue(getMomentDateTime(array[i].ts, booleanValue));
        // UserId
        sheetObj.getRange(lastrow + i + 1, columnNumberUser)
            .setValue(array[i].user);
        // Text
        sheetObj.getRange(lastrow + i + 1, columnNumberText)
            .setValue(array[i].text);
        // (Link)
        /*
        if (array[i].attachments) {
            for (var j = 0; j < arrat[i].attachments.length; j++ ) {
                sheetObj.getRange(lastrow + i + 1, columnNumberLink)
                    .setValue(
                        array[i].attachments[j].title 
                        + String.fromCharCode(10) 
                        + array[i].attachments[j].title_link
                    );
            }
        }
        */
    }
}


/**
* getMomentDateTime Function
*
* properties in the objects/rows
* @param  {string}  unixtime                    - e.g. 1557197740.001300
* @param  {boolean} booleanValue                - timestamp with year, or not
* @return {string}  'YYYY/MM/DD(ddd) HH:mm:ss' or 'MM/DD(ddd) HH:mm:ss'
*/
function getMomentDateTime(unixtime, booleanValue) {
    // Register lang:ja
    Moment.moment.lang(
      'ja', {
        weekdays: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
        weekdaysShort: ["日","月","火","水","木","金","土"],
      }
    );
    if ( booleanValue ) {
        //booleanValue == true, YYYY有り
        return Moment.moment(unixtime * 1000)
            .format('YYYY/MM/DD(ddd) HH:mm:ss');
    } else {
        //YYYY無し
        return Moment.moment(unixtime * 1000)
            .format('MM/DD(ddd) HH:mm:ss');
    }

}


個人的に詰まったところは、
- slack api methodで投稿内容を項目別に取得することと
- timestampの形式をunixから人が読みやすい形式に変えること
の2点でした。

これは、愚直にLogger.log(array[key])で配列で格納されている投稿内容をkeyで取り出しては、少し書き換えてということをやりました。

githubでコードを参照したい場合はこちらを。

まだ疲れていないころに書き上げたチュートリアルはこちらです↓↓(笑)

前編
【入門】Google Apps Scriptチュートリアル1/2(デモ動画付き・①doGet()とdoPost()でHellow World!)

後編
【入門】Google Apps Scriptチュートリアル2/2(デモ動画付き・②コマンドを叩いてチャンネル情報を表示させる)

P.S. Twitterもやってるのでフォローお願いします!
@gkzvoice

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2