@itsumonemutai

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を連携してSlackの投稿に押されているスタンプの数を計測したい

解決したいこと

GASとSlackを連携してSlackの投稿に押されているスタンプの数を計測したい

<詳細>
・Slackの投稿に押されているスタンプの数を計測してスプレットシートに反映させたい
・複数チャンネル(Slack)の情報を取得したい
└1つのスプレットシートにチャンネルごとのタブを作成して反映させたい

<できたこと>
・1つのチャンネルからスタンプ数を計測してスプレットシートに反映させる処理
・日時、投稿者(アドレス)、投稿者からメンションをつけられた人(アドレス)、リアクションしたユーザー数(Slackスタンプを押した人)、リアクションしたユーザーの名前(アドレス)の取得&スプレットシートへ反映させる

<解決したいこと>
・同じ条件で複数チャンネルで情報取得し、チャンネルごとのタブに結果を反映させる処理

発生している問題・エラー

spreadSheetのスクリプトのエラーが以下の通りです(spreadSheetスクリプト全体は以下に記載しております)

TypeError: Cannot read properties of undefined (reading 'length')
outputSpreadSheet	@ spreadSheet.gs:16

該当するソースコード

//GAS(spreadSheet)

/**
 * スプレッドシートにデータを書き出す
 * param dataList 書き出すデータのリスト
 */
function outputSpreadSheet(dataList) {
  const spredSheetID = PropertiesService.getScriptProperties().getProperty('SS_FILE_ID') 
  const sheetName = PropertiesService.getScriptProperties().getProperty('SS_SHEET_NAME') 
  const ss = SpreadsheetApp.openById(spredSheetID)

  // 作業シートを取得
  const sheet = ss.getSheetByName(sheetName);

  // 最終行に記載
  const lastRow = findLastRow(sheet, 1);

  for(let i = 0; i < dataList.length; i++){
    sheet.getRange(lastRow+1, i + 1).setValue(dataList[i]);
  }
}

/**
 * 指定列の「最終行の行番号」を返す
 *
 * @param {object} シート
 * @param {number} 列番号
 * @return {number} 最終行の行番号
 */
function findLastRow(sheet, col) {
  
  //指定の列を二次元配列に格納する※シート全体の最終行までとする
  const ColValues = sheet.getRange(1, col, sheet.getLastRow(), 1).getValues(); 
 
  //二次元配列のなかで、データが存在する要素のlengthを取得する
  const lastRow = ColValues.filter(String).length;
  
  return lastRow;
}

GAS(properties)

/**
 * properties セット用
 */
function setProperties() {
  const scriptProperties = PropertiesService.getScriptProperties();

  // プロパティ設定用
  scriptProperties.setProperties({
    // アプリ名:Slack履歴取得
    "SLACK_HISTORY_API_TOKEN": "API,
    // アプリ名:SlackユーザID取得API
    "SLACK_USER_API_TOKEN": "API",
    
    // チャンネル名(1)
//仮でチャンネル名1と定義
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "1",
    
    // チャンネル名(2)
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "2",
    
    // チャンネル名(3)
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "3",

    // チャンネル名(4)
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "4",

    // チャンネル名(5)
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "5",

    // SpreadSheet ファイルID
    "SS_FILE_ID": "ID",
  });
}

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

①リスト上記にも記載しましたが、以下のコードを書く+チャンネルごとのタブを作成したのですが反映されていない

    // チャンネル名(5)
    "SLACK_CHANNNEL_ID": "ID",
    // SpreadSheet シート名
    "SS_SHEET_NAME": "5",

②上記記載のエラーの原因(仮説)

・「dataList」が配列になっていないから?
・「function outputSpreadSheet(dataList) 」の時点で関数を呼び出した際に「dataList」で何も受け取れていない?

console.log(dataList)
で実行した結果、
「情報 undefined」

・スプレッドシートにデータを書き出す処理をするのにデータを受け取っていない状態?
→今ここでどうしたらいいか分からず詰まっています><

今までエラーの原因を調べていたのですが、おそらくGASから実行ボタンを押していることがエラーの原因かと思います><
そうなると、複数チャンネルから情報を取得しスプレットシートに反映する方法についてご相談させていただけますと幸いです。

0 likes

No Answers yet.

Your answer might help someone💌