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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

1415閲覧

GASにて書誌情報取得時、書誌情報なしの書籍タイトルを空白にしない方法について

somsom

総合スコア14

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2020/09/25 20:23

編集2020/09/25 20:25

お世話になっております。

下記ブログを参考にGoogle スプレッドシートにて、ISBNコードから書誌情報を自動取得するスクリプトを作成しました。

https://www.y-shinno.com/openbd-gas-sp/

ブログからの1つの変更点として、ISBNが空白もしくは、書誌データがない場合は空白データを上書きしないようにしております。

GAS

1 2function getBibliographByISBN(isbn){ 3const url = `https://api.openbd.jp/v1/get?isbn=${isbn}`; 4const res = UrlFetchApp.fetch(url); 5const ss = SpreadsheetApp.getActiveSpreadsheet(); 6const sh = ss.getSheetByName("ISBN"); 7const values = sh.getDataRange().getValues(); 8let i=1; i<values.length; i++; 9return JSON.parse(res.getContentText()); 10} 11 12const col = { 13isbn:2, 14title:3, 15author:7, 16publisher:4, 17pubdate:8, 18price:11, 19content:9, 20IMA:5, 21image:6, 22flag:10 23} 24 25class BibliographManager{ 26constructor(isbn){ 27let bibliograph = this.getBibliographByISBN(isbn); 28if(bibliograph[0] == null){ 29this.flag = "no"; 30}else{ 31this.flag = "yes"; 32this.title = bibliograph[0].summary.title; 33this.author = bibliograph[0].summary.author; 34this.publisher = bibliograph[0].summary.publisher; 35this.pubdate = bibliograph[0].summary.pubdate; 36try{ 37this.price = bibliograph[0].onix.ProductSupply.SupplyDetail.Price[0].PriceAmount; 38this.content = bibliograph[0].onix.CollateralDetail.TextContent[0].Text; 39} catch(e){ 40} 41 42this.image = bibliograph[0].summary.cover; 43} 44} 45getBibliographByISBN(isbn){ 46const url = `https://api.openbd.jp/v1/get?isbn=${isbn}`; 47const res = UrlFetchApp.fetch(url); 48return JSON.parse(res.getContentText()); 49} 50} 51 52function updateBibliographInSpreadsheet(){ 53const ss = SpreadsheetApp.getActiveSpreadsheet(); 54const sh = ss.getSheetByName("ISBN"); 55const values = sh.getDataRange().getValues(); 56 57for(let i=1; i<values.length; i++){ 58let isbn = values[i][col.isbn -1] 59let bibliograph = new BibliographManager(isbn); 60 61//書誌情報をセット 62 63let bibliograph1 = this.getBibliographByISBN(isbn) 64if(bibliograph1[0] == null){ 65values[i][col.content-1] = ""; 66}else{ 67values[i][col.flag-1] = bibliograph.flag; 68values[i][col.title-1] = bibliograph.title; 69values[i][col.author-1] = bibliograph.author; 70values[i][col.publisher-1] = bibliograph.publisher; 71values[i][col.pubdate-1] = bibliograph.pubdate; 72values[i][col.price-1] = bibliograph.price; 73values[i][col.content-1] = bibliograph.content; 74if(bibliograph.image == ""){ 75//書籍によってはカバー写真がない場合があるので,その場合はnoimageの画像URLをセットする 76values[i][col.image-1] = "https://www.hanmoto.com/bd/img/noimage.jpg"; 77}else{ 78values[i][col.image-1] = bibliograph.image; 79values[i][col.IMA-1] = '=image("' + bibliograph.image + '")'; 80} 81} 82} 83sh.getRange(1, 1, values.length, values[0].length).setValues(values); 84}

61行目の書誌情報をセットする処理のあとに、IF文で書誌情報がない場合はタイトルを上書きしない処理をしております。しかし、おそらくIFの処理をするたびにAPIリクエストしているため、スクリプトの実行時間が少し長くなっていると気がしております。
運用上、書誌データがない場合はタイトルを手入力し、時間経過とともに行を追加していく運用なので、ある程度実行時間が短い処理を希望しています。
他にも条件分岐の方法を変えてみたのですが、処理自体がうまくいかない状況です。

①ISBNがあり、書誌情報がある場合はタイトルを上書きする。
②ISBNが空白、もしくはISBNはあるがデータがない場合はタイトルを上書きしない

以上の処理を実行する際に、実行時間を短くするためにはどのような記述にすればよいか、教えて頂ければ大変ありがたいです。
どうぞよろしくお願いいたします

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

何度もAPIを呼び出すと時間がかかるのであれば、1回のリクエストで取得できないか?
と思い、試してみたらいけそうですね。

function getBibliographByISBN(isbn)
の中で使っている
const url = https://api.openbd.jp/v1/get?isbn=${isbn};
を使う際に、isbnをカンマで区切って指定してみて下さい。

実際に見てもらった方が分かりやすいですが
https://api.openbd.jp/v1/get?isbn=978-4-7679-6175-0

https://api.openbd.jp/v1/get?isbn=978-4-7679-6175-0,978-4-7598-2014-0

上記はisbnを1つ指定した場合と2つ指定した場合です。

何個までまとめて指定出来るかなどは分かりませんが、上記の方法でまとめて取得し
BibliographManagerクラスに入れてしまえば処理が早くなるかもしれません。

投稿2020/09/28 07:11

mkk

総合スコア378

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

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

somsom

2020/10/04 09:50

ご回答ありがとうございました!こちらで試してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問