@sonblet

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でjsonの値をうまく取り出せない

解決したいこと

GASでSlackの勤怠管理botを作っています。
GASでSlackに勤怠確認メッセージを送り、
Slackから送信したデータをjson形式で受け取るところまではできたのですが、
そこからうまく目的の値を取り出せなくなってしまいました・・・
いろいろ試してみましたが全然ダメです・・・
解決方法を教えてください。

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

目的の値を指定しているはずなのだが、json形式のまま出力されてしまう

該当するソースコード

function sendSlackMessage_(url, data) {
const params = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(data)
};
const res = UrlFetchApp.fetch(url, params);
return res;
}

function timer(){
console.log('Log');
}

const PROPS = PropertiesService.getScriptProperties();

function gasToSlack() {
const webhook = PROPS.getProperty('WEBHOOK');
console.log(webhook);

const data = {
"blocks": [
{
"type": "section",
"text": {
"type": "plain_text",
"text": "おはようございます!出勤しましたか?",
"emoji": true
}
},
{
"type": "input",
"element": {
"type": "timepicker",
"initial_time": "08:00",
"placeholder": {
"type": "plain_text",
"text": "Select time",
"emoji": true
},
"action_id": "timepicker-action"
},
"label": {
"type": "plain_text",
"text": " ",
"emoji": true
}
},
{
"type": "input",
"element": {
"type": "plain_text_input",
"action_id": "plain_text_input-action"
},
"label": {
"type": "plain_text",
"text": " ",
"emoji": true
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "出勤しました",
"emoji": true
},
"value": "submit",
"action_id": "actionId-0"
}
]
}
]
}
const res = sendSlackMessage_(webhook, data);
Logger.log(res);
}

function doPost(e) {
const payload = JSON.parse(e['parameter']['payload']);
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
const user = payload['user']['name'];
sheet.appendRow(user);
}

自分で試したこと

記述の仕方をいろいろ変えてみましたが、ダメでした・・・

0 likes

1Answer

関係の有りそうなところだけを抜き出して

const PROPS = PropertiesService.getScriptProperties();

function gasToSlack() {
  const webhook = PROPS.getProperty('WEBHOOK');
  // console.log(webhook);
  const data = {}; // (中略)
  const res = sendSlackMessage_(webhook, data);
  Logger.log(res);
}

function sendSlackMessage_(url, data) {
  const params = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(data)
  };
  const res = UrlFetchApp.fetch(url, params);
  return res;
}

sendSlackMessage_()const res = UrlFetchApp.fetch(url, params);で取れる値がjson文字列だとすると、JSON.parse()でjsonオブジェクトに変換してあげる必要があると思います。

GASでJSON形式データを読み込み、処理可能なオブジェクトや配列に変換する方法

1Like

Comments

  1. @sonblet

    Questioner

    ありがとうございます。
    doPost(e)のconst payload = JSON.parse(e['parameter']['payload']);で変換したつもりなのですが、ここではだめということでしょうか?
  2. 失礼しました。
    `doPost()`の方は`JSON.parse(e.postData.contents)` 又は `JSON.parse(e.postData.getDataAsString())`で先にオブジェクトに変換して扱います。



    [JSONパラメータを受けparseする](https://qiita.com/shirakiya/items/db22de49f00710478cfc#json%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%97%E3%81%91parse%E3%81%99%E3%82%8B)

    [Google AppScriptでHTTP POST(doPost)を受け付ける最小コード (2022年夏)](https://qiita.com/ma2shita/items/bf86e46385a8c0b26c74#%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%B4%BB%E7%94%A8%E3%81%AB%E3%81%AF)

    ---

    1つ目の記事の「ちなみに」の箇所に書いてありますが、`e.parameter`にはクエリパラメータが入っているようなので、POSTされたデータは`e.postData`の方を使う必要がありそうです。
  3. @sonblet

    Questioner

    ありがとうございます!
    でもなぜか、`e.postData`ですと何も受け取れなくなってしまいました・・・
    苦肉の策で
    const user = payload['user']['name'];

    const name = payload.user.name;
    にしたら、取得できました。謎です。
    でも、アドバイスしてくださって、ありがとうございました!

Your answer might help someone💌