@sonblet

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASでうまく取り出せないjsonの値がある

解決したいこと

GASでbacklogの課題一覧を取得しようとしています。
jsonをパースして、うまく取り出せた値もあるのですが、
どうしてもうまく取り出せない値があって困っています…
解決方法を教えてください🙇‍♀️

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

下の画像のような感じで「ID」や「担当者」などは取り出せるのに「カテゴリー」など、
{name=名前, id=1.0, displayOrder=0.0}の形から目的の値を取り出すことができないです。

スクリーンショット 2023-03-27 15.26.23.png

該当するソースコード

const space_id = "XXXX";
const api_key = "XXXXXXXXXX";
const sheet_id = "XXXXXXXXXX";

function getPjList() {
  const api = "https://" + space_id + ".backlog.jp/api/v2/projects?apiKey=" + api_key;
  let response = UrlFetchApp.fetch(api);
  let pj_list = JSON.parse(response.getContentText());
  for (let i = 0; i < Object.keys(pj_list).length; i++) {
    getBackLogData(pj_list[i].id, pj_list[i].name);
  }
}

function getBackLogData(project_id, project_name) {
  let offset = 1;
  let loop = true;
  let sheet = insertOrSelectSheet(project_name);
  const title = [
    "ID",
    "カテゴリー名",
    "件名",
    "状態",
    "担当者",
  ];

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

  while (loop) {
    const api = "https://" + space_id + ".backlog.jp/api/v2/issues?apiKey=" + api_key + "&projectId[]=" + project_id + "&sort=status&order=&statusId[]=1&statusId[]=2&statusId[]=27369&statusId[]=27441&statusId[]=27370&statusId[]=27442&statusId[]=27371&statusId[]=27372&statusId[]=6942&statusId[]=26558&statusId[]=3&count=100&offset=" + offset;
    let response = UrlFetchApp.fetch(api);
    let issue_list = JSON.parse(response.getContentText());
    let range = 1 + offset;

    for (let i = 0; i < Object.keys(issue_list).length; i++) {
      let j = 0;
      sheet.getRange(i + range, ++j).setValue(issue_list[i].id);
      sheet.getRange(i + range, ++j).setValue(issue_list[i].issueType.name);
      sheet.getRange(i + range, ++j).setValue(issue_list[i].summary);
      sheet.getRange(i + range, ++j).setValue(issue_list[i].status.name);
      sheet.getRange(i + range, ++j).setValue(issue_list[i].category);
      sheet.getRange(i + range, ++j).setValue(issue_list[i].assignee ? issue_list[i].assignee.name : "未設定");
    }

    if (Object.keys(issue_list).length == 100) {
      offset += 100;
      Utilities.sleep(1000);
      Logger.log("休憩中");
    } else {
      loop = false;
    }

  }

}

function insertOrSelectSheet(pj_name) {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let spreadsheet = SpreadsheetApp.openById(sheet_id);
  let sheet = spreadsheet.getSheetByName(pj_name);
  if (sheet === null) {
    return ss.insertSheet(pj_name);
  }
  return sheet;
}


自分で試したこと

.nameと指定してみたり、
配列の数字を指定してみたり、
nullの場合の値を設定してみたりしましたが、
{name=名前, id=1.0, displayOrder=0.0}の形から先に進めません😭

0 likes

1Answer

GASの経験は無いのですが、categoryが配列になっているのは考慮されていますか?
レスポンスの例としても"category": [],となっていますし、Backlogの画面でも複数選択が可能です。
category.nameとしても取得できないのはそのためではないでしょうか?

ドキュメントのサンプルを示されてもデータが空になっているのですから、あまり参考にはできません。
実際のデータがどのようになっているのか確認しましょう。それが解決につながる方法です。

2Like

Comments

  1. @sonblet

    Questioner

    ありがとうございます。
    配列だとはわかっているのですが、どのように扱えばいいのかわかりません…
    このような感じで出力されていて、何も読み取れません↓
    category=[Ljava.lang.Object;@5075a17e,
    ここから、どう処理すればいいか教えていただけないでしょうか?
    category[0]ですと{name=名前, id=1.0, displayOrder=0.0}と出ますが、
    category[0].nameとすると以下のエラーが出てしまいます。
    TypeError: Cannot read properties of undefined (reading 'name')
  2. 試してみましたがcategoryは配列として扱えたので、category[0].nameのような形で参照することが出来ました。

    console.log()などでデータを確認されることをお勧めします。

    > category[0].nameとすると以下のエラーが出てしまいます。
    > TypeError: Cannot read properties of undefined (reading 'name')

    データの中にカテゴリーが設定されていない課題が混ざっていませんか?
  3. @sonblet

    Questioner

    ご回答くださった皆さま

    issue_list[i].category[0] ? issue_list[i].category[0].name : "未設定"
    と、nullの場合を設定したらできました!!!
    先週からずっとハマってしまっていたので、解決できて嬉しいです涙
    質問にも書いた通り、前も試してみたはずなのですが、何かが間違っていたようです。

    初心者質問でしたのに、アドバイスを下さってありがとうございました!!!
    とても勉強になりました。
    いただいたアドバイスを参考に、もっと精進したいと思います。
    本当にありがとうございました。

Your answer might help someone💌