実現したいこと
GASで画像出力する際に、隣のセルのURLを基準に画像を表示したい。
しかし、セルの行番号が2〜11までの表示が繰り返されてしまい、
12〜以降のセルの行番号の出力ができないので、解決方法を教えてください。
該当のソースコード
GAS
1function searchSystem () { 2 var book = SpreadsheetApp.getActiveSpreadsheet() 3 var sheetData = book.getSheetByName('〇〇検索') 4 var currentRowIndex = 2 5 6 var headers = [['商品画像URL', '商品画像']] 7 sheetData.getRange(1, 1, 1, headers[0].length).setValues(headers) 8 9 // シートに挿入する値 10 var values = [] 11 12 // 検索 13 for (var sc = 1; sc <= 100000; sc++) { 14 var rootHtml = getHtml('サイトのURL' + sc) 15 16 if (!rootHtml || rootHtml.length < 100000) { 17 Logger.log('no more page : ' + rootHtml) 18 break 19 } 20 21 // 1次元配列として取得 22 for (var si = 0; si < 10000; si++) { 23 24 // 商品画像URL 25 var itemUrl = searchBy(rootHtml, '<div class="item_imgs" style="background-image:url(',')"', '<section class="search_item_list_section" data-an-comp="search_item">', 10000, si) 26 values[currentRowIndex - 2].push(itemUrl ? itemUrl.trim() : '該当データ無し') 27 28 // 商品画像 29 var i = si + 2 30 var itemImage = '=IMAGE(B' + parseInt(i) + ',4,100,50)' 31 values[currentRowIndex - 2].push(itemImage ? itemImage.trim() : '該当データ無し') 32 33 currentRowIndex++ 34 } 35 36 // 2秒~5秒スリープ 37 Utilities.sleep(2000 + Math.floor(Math.random() * (2999)) + 1) 38 } 39 40 // 一括でインサート 41 if (values && values[0]) { 42 sheetData.getRange(SEARCH_START_LOW, SEARCH_COL_INDEX, values.length, values[0].length).setValues(values) 43 } 44}
発生している問題
GAS
1var itemImage = '=IMAGE(B' + parseInt(i) + ',4,100,50)'
↑これにより出力されるデータが
↓このようになってしまいます
=IMAGE(B2,4,100,50) =IMAGE(B3,4,100,50) =IMAGE(B4,4,100,50) =IMAGE(B5,4,100,50) =IMAGE(B6,4,100,50) =IMAGE(B7,4,100,50) =IMAGE(B8,4,100,50) =IMAGE(B9,4,100,50) =IMAGE(B10,4,100,50) =IMAGE(B11,4,100,50) ←B11までは正しく表示 =IMAGE(B2,4,100,50) ←本来であればB12になるはずがB2に戻ってしまう =IMAGE(B3,4,100,50) ←続けて問題ありそれ以降も問題あり =IMAGE(B4,4,100,50) =IMAGE(B5,4,100,50) =IMAGE(B6,4,100,50) =IMAGE(B7,4,100,50) =IMAGE(B8,4,100,50) =IMAGE(B9,4,100,50) =IMAGE(B10,4,100,50) =IMAGE(B11,4,100,50) ・ ・ ・ =IMAGE(B2,4,100,50) ←ひたすらB2~B11が繰り返されてしまいます =IMAGE(B3,4,100,50) =IMAGE(B4,4,100,50) =IMAGE(B5,4,100,50) =IMAGE(B6,4,100,50) =IMAGE(B7,4,100,50) =IMAGE(B8,4,100,50) =IMAGE(B9,4,100,50) =IMAGE(B10,4,100,50) =IMAGE(B11,4,100,50)
試したこと
ネットで問題を探して、文字列と数値の変換がうまくいっていない可能性があると思い、
parseInt関数やダブルコーテーションの変更など試しましたがうまくいきませんでした。
↓これが一応試してみたものになります。
var i = parseInt(si) + 2 var i = parseInt(si) + "2" var i = parseInt("si") + 2 var i = parseInt("si") + "2" var i = si + 2 var i = si + "2" for (var si = "0"; si < "10000"; si++) {
###補足情報
function searchByの独自関数は問題なく機能しています。
###papinianusの質問に回答します。
currentRowIndex++のインデント位置からしてifかなにかを削っているはず。に関してですが、商品画像URLの前にASINコードを用意しています。
・ ・ ・ for (var si = 0; si < 10000; si++) { // ASIN var asin = searchBy(rootHtml, '<div data-caution="', '">', 'class="search_item_list_section"', 100000, si) if (!asin) { break } values[currentRowIndex - 2] = [] values[currentRowIndex - 2].push(asin || '該当データ無し') // 商品画像URL ・ ・ ・
searchByに関して追記します。
GAS
1/* 2 target 検索対象 3 startKey 検索開始文字列 4 endKey 検索終了文字列 5 searchStartKey 検索対象開始文字列 6 ※なしの場合は検索対象全てから検索 7 searchLength 検索対象文字数 8 ※なしの場合は検索対象開始文字列以降全てから検索 9 searchRepeat 検索繰り返し回数 10 */ 11function searchBy (target, startKey, endKey, searchStartKey, searchLength, searchRepeat) { 12 // 検索開始文字列があった場合のみ 13 if (searchStartKey) { 14 var index = target.indexOf(searchStartKey) 15 for (var c = 0; searchRepeat && c < searchRepeat; c++) { 16 index = target.indexOf(searchStartKey, index + 1) 17 } 18 19 if (index === -1) { 20 Logger.log("searchStartKey not found") 21 return null 22 } 23 24 // 指定文字数取得して検索対象を更新 25 target = target.substring(index + searchStartKey.length, 26 searchLength ? index + searchStartKey.length + searchLength : target.length) 27 } 28 29 var startIndex = startKey !== null ? target.indexOf(startKey) + startKey.length : 0 30 var endIndex = endKey !== null ? target.indexOf(endKey, startIndex) : target.length 31 32 if ((startKey === null || startIndex !== (startKey.length - 1)) && endIndex !== -1) { 33 return target.substring(startIndex, endIndex) 34 } else { 35 return null 36 } 37}
###function test()を実行した際のログを表示します。
GAS
1[18-10-04 12:47:05:886 JST] searchStartKey not found 2[18-10-04 12:47:05:887 JST] asin:null
このスクリプトですが、rootHtml.lenght <100000 が常にTrueじゃないですか? Logger.log('no more page : ' + rootHtml) が吐かれてそうな気がするのですが…。
色々関数が入っていて、正確に実行できていないかもしれないですが、私が実行した限り values[currentRowIndex - 2] がundefined で実行できません。
searchByは無関係、siも、iもnumber型だからparseIntも無関係。currentRowIndex++のインデント位置からしてifかなにかを削っているはず。だからmacaron_xxxさんは動作させることもできない。おそらくそこにvalues.push([])みたいなコードがあると思われる。その間違った関数は全体で何行出力されていますか?
papinianusさん回答ありがとうございます。currentRowIndex++のインデント位置からしてifかなにかを削っているはず。に関しては追記させていただいたので確認ください。
values.push([])みたいなコードがあると思われる。その間違った関数は全体で何行出力されていますか?に関しては、values[currentRowIndex - 2].push()のことでしょうか?
間違った関数はB2で繰り返されるIMAGEのことでした。改行を入れられず誤解を招く文章でした、すみません。追記感謝
回答4件
あなたの回答
tips
プレビュー