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

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

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

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

3658閲覧

GoogleスプレッドシートでWEBサイトの画像を高速表示する方法

ryu01212008

総合スコア26

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2018/11/14 14:08

困っていること

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||||

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

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

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

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

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

guest

回答1

0

ベストアンサー

困っていることと実現したいことに乖離があります。

実現したいことは現在のコードの問題ではなく、仕組みが足りてない状態です。実現したいことは業務を便利にしたいということの言い換えですよね。
ちなみに今の作業のうち、2,3についてはスクリプトでURLが展開されるシートに画像を表示すればそもそも不要な作業のはず(記載された運用要件からは)で、コピペしようと思ったからコピペしなければならなくなった、のではないでしょうか。

困っていることはIMAGE関数を使う限り原理的に回避できません。シート関数にはスルーという仕組みがありません。
またIMAGEに代えて画像をコピペするようなコードを作ったところで、画像が多ければ開くことに時間がかかるのは回避できません。
困っていることを解決するにはキャッシュをためておく場所を作るとか必要なとき必要なだけの画像を見せるビューを作るとかいう全然違うモノが求められていると思います。

投稿2018/11/15 00:33

papinianus

総合スコア12705

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

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

ryu01212008

2018/11/20 03:30 編集

ご返信遅くなりすみません。 仰る通りです。 ただ、私の技術ではまだできる領域にないのですが、phpやhtmlで実現することはできますでしょうか? できそうであれば、スプレッドシートの管理をやめて、サーバー上で管理したいと考えています。
papinianus

2018/11/20 08:44 編集

サーバを用意してphpを動かせるならだいたいのことはできます 簡易にやりたい、あるはgoogleシートでどこまでできるかの見極めだと思いますが、「今やっていること」が最善なのでしょうか?もしこれがベストでどうしても質問に書いている困っていることをしたいのであればほぼほぼ無理です。いずれ(それも遠くない将来)重くなることを防げません。もっとやりたいことを一般化して、アイデアを募るのであれば有益な回答も来るかと思います。 実現したいことについては、プログラムやgasでの課題ではありません。繰り返しになりますが、少なくとも今の質問では、コピペする必要性が分からず、御社が(本質的に不要な)コピペをしていてそれを便利に自動化したい、ということでしかないので、御社の負担で解決してくださいとしか言えません(具体的にいえば、コードを書いてみて、動かないポイントに絞って質問をすれば回答が得られると思います)。 あるいは、何らかのプログラム上の難点があってコピペで回避している、ゆえにそのコピペ負担を減らしたい、という経緯があって、コピペの自動化じゃなくて難点回避でもいいので、手動でコピペしなくてすむ方法はないですか?という質問ならまだ分かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問