困っていること
Googleスプレッドシート上でモノレートというサイトから画像を大量に引っ張ってくるときの表示速度を改善したいです。
現在、500行近くのデータ全てに対して画像を表示させている(1行あたり1画像のみ)ため、スプレッドシートを開いたときのスピードがデータが増える度に重くなっていき困っています。
また、指定のサイトから画像のURLを拾ってきて、IMAGE関数で表示するまでの工数が多いので、ボタンを一回押しただけで、処理ができるようにしたいです。
不足している情報があれば、お答えしますのでご回答よろしくお願いします。
実現したいこと
GASのボタン一つで画像の取得ができること
ただし、下記の条件を満たせると非常にありがたいです。
・すでに画像表示処理が済んでいる該当のセルは何も処理せずスルー ・画像表示が済んでいないセルだけに対してGASの実行 ・手動でコピペ作業がないのが理想
現状の画像を表示するまでの手順
①GASでモノレートの商品ページのURLから画像のURLを取得 ②①とは別シートに取得した画像のURLをA列に貼り付け ③B列に『ARRAYFORMULA関数』と『IMAGE関数』を使って画像を表示
GASで対象サイトから画像のURLを取得するGAS
GAS
1/** 2 * search by start and end 3 * 4 * @param target 検索対象 5 * @param startKey 検索開始文字列 6 * @param endKey 検索終了文字列 7 * @param searchStartKey 検索対象開始文字列 8 * ※なしの場合は検索対象全てから検索 9 * @param searchLength 検索対象文字数 10 * ※なしの場合は検索対象開始文字列以降全てから検索 11 * @param searchRepeat 検索繰り返し回数 12 * @returns {string | null} 検索結果 13 * ※なしの場合はnull 14 */ 15function searchBy (target, startKey, endKey, searchStartKey, searchLength, searchRepeat) { 16 // 検索開始文字列があった場合のみ 17 if (searchStartKey) { 18 var index = target.indexOf(searchStartKey) 19 for (var c = 0; searchRepeat && c < searchRepeat; c++) { 20 index = target.indexOf(searchStartKey, index + 1) 21 } 22 23 if (index === -1) { 24 Logger.log("searchStartKey not found") 25 return null 26 } 27 28 // 指定文字数取得して検索対象を更新 29 target = target.substring(index + searchStartKey.length, 30 searchLength ? index + searchStartKey.length + searchLength : target.length) 31 } 32 33 var startIndex = startKey !== null ? target.indexOf(startKey) + startKey.length : 0 34 var endIndex = endKey !== null ? target.indexOf(endKey, startIndex) : target.length 35 36 if ((startKey === null || startIndex !== (startKey.length - 1)) && endIndex !== -1) { 37 return target.substring(startIndex, endIndex) 38 } else { 39 return null 40 } 41} 42 43var SEARCH_COL_INDEX = 1 44var SEARCH_START_LOW = 2 45var SEARCH_LOW_COUNT = 100 46 47function mnImage () { 48 var book = SpreadsheetApp.getActiveSpreadsheet() 49 var sheetData = book.getSheetByName('モノレート画像検索') 50 var currentRowIndex = 2 51 52 var headers = [['URL','商品画像URL']] 53 sheetData.getRange(1, 1, 1, headers[0].length).setValues(headers) 54 55 // シートに挿入する値 56 var values = [] 57 58 // 1次元配列として取得 (A2 ~ A(SEARCH_LOWS)) 59 var keys = Array.prototype.concat.apply([], 60 sheetData.getRange(SEARCH_START_LOW, SEARCH_COL_INDEX, SEARCH_LOW_COUNT, SEARCH_COL_INDEX).getValues()) 61 for (var ki = 0; ki < keys.length; ki++) { 62 var key = keys[ki] 63 if (!key) { 64 break 65 } 66 values[ki] = [] 67 68 var rootHtml = getHtml(key) 69 70 // 商品画像URL 71 var itemUrl = searchBy(rootHtml, 'value="','"', 'id="history_data_image_path"',5000) 72 values[ki].push(itemUrl || '該当データ無し') 73 74 // 2秒~5秒スリープ 75 if (ki !== (keys.length - 1)) { 76 Utilities.sleep(2000 + Math.floor(Math.random() * (2999)) + 1) 77 } 78 currentRowIndex++ 79 } 80 81 // 一括でインサート 82 if (values && values[0]) { 83 sheetData.getRange(SEARCH_START_LOW, SEARCH_COL_INDEX + 1, values.length, values[0].length).setValues(values) 84 } 85} 86
該当のスプレッドシート
| A | B | 1| 画像URL | 画像 | ※|https://abc123image|=ARRAYFORMULA(IMAGE(I5:I))|←←※セル内の関数 2|https://abc123image| ここに画像 | 3||||
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/20 03:30 編集
2018/11/20 08:44 編集