質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

755閲覧

Google Apps Scriptで取得した下記JSON形式の情報をGoogleスプレッドシートのセルに出力したい

pepe4422

総合スコア5

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/10/03 03:18

前提

某ウェブサービスからAPIで情報を取得し、Googleスプレッドシートへ随時連携するアプリケーションを作成したいと考えております。

実現したいこと

Google Apps Scriptで取得した下記JSON形式の情報をGoogleスプレッドシートのセルに出力したいです。
類似する質問などを参考にコードを作成しましたが、うまく動作しませんでしたため、質問させていただきます。

"hasMore": true,
"data": [
{
"project_id": 1,
"project_name": "XXXXXXXX",
"customer": {
"mail": "XXXXXXXXXX",
},
}
{
"project_id": 2,
"project_name": "XXXXXXXX",
"customer": {
"mail": "XXXXXXXXXX",
},
}
],

発生している問題・エラーメッセージ

TypeError: Cannot read property "hasMore" from undefined.

該当のソースコード

Google Apps Script

function myFunction() {

var response = UrlFetchApp.fetch("https://api.xxxxxxx.com/v1.1/projects?limit=3", {
"method": "GET",
"headers": {
"content-type": "application/json",
"Api-Key": "xxxxxxxxxxxxxxxxxxxx"
},
})
json = JSON.parse(response);
const sheet_id = 'xxxxxxxx';
const sheet_name = 'test';
const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
const lastRow = sheet.getLastRow();
sheet.getRange(lastRow , 1).setValue(json[0].hasMore[0],data[0],project_id[0]);
}

試したこと

Logger.log(response); でのログ確認でJSON形式のデータが取得できていることは確認しました。
また、setValue部分についても下記については試行済みです。

sheet.getRange(lastRow , 1).setValue(json[0].data[0],project_id[0]);
sheet.getRange(lastRow , 1).setValue(json[0].project_id[0]);

ご教授の程お願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/10/03 04:20

hasMoreは配列なのですか?
Cocode

2022/10/03 04:53

スプレッドシートにはdataの中の↓の内容を保存したいのかと思いますが、 "project_id": 1, "project_name": "XXXXXXXX", "customer": { "mail": "XXXXXXXXXX", hasMoreは何のために使いますか? jsonの中にhasMoreは1つしかないと思われますが…
pepe4422

2022/10/03 04:59

YAmaGNZ様 ご対応ありがとうございます。 >hasMoreは配列なのですか? →hasMoreは配列ではありません。  よろしくお願いいたします。
pepe4422

2022/10/03 05:00

Cocode様 ご対応ありがとうございます。 >hasMoreは何のために使いますか? >jsonの中にhasMoreは1つしかないと思われますが… →おっしゃる通りhasMoreはひとつしかなく、当方としては不要なのですが、取得する際に必要?かと思い記載しております。  よろしくお願いいたします。  
YAmaGNZ

2022/10/03 06:15

配列じゃないなら json[0].hasMore[0] ではなく json[0].hasMore なのではないですか?
guest

回答1

0

ベストアンサー

一応私の環境では正常に動きました。
実際のJSONデータでは検証をしていないので、不具合があれば教えてください。
修正します。

コード例

javascript

1function myFunction() { 2 const response = UrlFetchApp.fetch("https://api.xxxxxxx.com/v1.1/projects?limit=3", { 3 "method": "GET", 4 "headers": { 5 "content-type": "application/json", 6 "Api-Key": "xxxxxxxxxxxxxxxxxxxx" 7 }, 8 }) 9 const json = JSON.parse(response); 10 const sheet_id = 'xxxxxxxx'; 11 const sheet_name = 'test'; 12 const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name); 13 14 // シートに出力したいデータだけを抜き出して、2次元配列を生成 15 const output = json.data.map(obj => [obj.project_id, obj.project_name, obj.customer.mail]); 16 // [ 17 // [1, 'Project A', 'XXXXX@XXXXX'], 18 // [2, 'Project B', 'YYYYY@YYYYYY'] 19 // ] 20 21 // getRange()で使用する値を設定 22 const startRow = sheet.getLastRow() + 1; // シートに何か文字が書かれている最後の行+1が、データ挿入開始の行 23 const rowLength = output.length; // 生成した配列の長さ=行の数 24 const colLength = output[0].length; // 生成した配列の中の、配列の長さ=列の数 25 26 // シートの指定した範囲に、outputを出力する 27 // getRange(開始行番号, 開始列番号, 行数, 列数) 28 sheet.getRange(startRow, 1, rowLength, colLength).setValues(output); 29}

解説

  • 1セルではなく、範囲を指定して複数の値を一括して出力する場合、.setValue()ではなく.setValues()です。(sが抜けている。複数形にしてね)
    • .setValues()の中身は2次元配列で、出力したい値たちを書きます。

javascript

1.setValues( 2 [ 3 ['col 1', 'col 2', 'col 3'], // row 1 4 ['col 1', 'col 2', 'col 3'] // row 2 5 ] 6)
  • hasMoreはシートに出力しなくてもいいデータとのことですので、.setValues()の中に書かないでください。

投稿2022/10/03 05:54

編集2022/10/03 05:59
Cocode

総合スコア2314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepe4422

2022/10/03 07:22

Cocode様 ご回答ありがとうございます。 ご親切にコードまで記載いただき大変助かります、無事スプレッドシートに出力することができました。 ご対応いただきありがとうございました。 YAmaGNZ様もご対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問