お世話になっております。
下記ブログを参考に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はあるがデータがない場合はタイトルを上書きしない
以上の処理を実行する際に、実行時間を短くするためにはどのような記述にすればよいか、教えて頂ければ大変ありがたいです。
どうぞよろしくお願いいたします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/04 09:50