JS/GAS ともに超初心者です。

GASを使って「Amazonの商品レビューの数を定期的に取得し、レビュー数に変化があったらメールを送る」という機能を実現したいです。

あらかじめスプレッドシートに商品名、URL、レビュー数を入力しておきます。  
チェックする商品はすでにレビューが1つ以上ついているものとします。

以下のようなコードを書きましたが、うまく動くときと動かないときがあります。  
ときどき取得してくるレビュー数がゼロになってしまうようで、ゼロになったとメールが送られ、スプレッドシートのレビュー欄が空白になっています。  
その後正しいレビュー数を取得してまたメールが送られます。

```

    function myFunction() {
    
      var sheet = SpreadsheetApp.getActiveSheet();
    
      var product = sheet.getRange(1,1).getValue();
      var URL     = sheet.getRange(1,2).getValue();
      var review  = sheet.getRange(1,3).getValue();
    
      var response = UrlFetchApp.fetch( URL );
      var htmlstr = response.getContentText();
    
      // レビューの数を取得
      var myReg = RegExp( /(\d\d?)件のカスタマーレビュー/ );
      var result = htmlstr.match(myReg);
      var new_review = RegExp.$1;
    
      // レビュー数が変化していたらメールを送る
      if( new_review != review){
        MailApp.sendEmail(
          "*******@****.com",
          model + "のレビュー数が変わりました。",
          URL + "\n" + product + "のレビュー数が[" + review + "]から[" + new_review + "]に変化しました。"
        );
        // レビュー数を書き換える
        sheet.getRange(1,3).setValue( new_review );
      }
    }
    
```

Amazon側のレスポンスが悪くレビュー数がきちんと取得できていないのでしょうか。

なお、実際にはforループで複数の商品をチェックしていますが、問題の解決に必要だと思うところだけを抜き出して書き直しました。

よろしくお願いします。
CC BY-SA 3.0
2017-01-19T11:57:27.723
31986
2022-01-20T17:06:00.627
20300
question
google-apps-script
GASでAmazonのレビュー数を取得したい
いくつか追加情報が必要と思われます。

  * レビュー数がゼロになった場合にはエラーが発生するのでしょうか。それとも何らかの情報があるのでしょうか。レビュー数がゼロになった際に回収したhtmlのデータが分かると解決法につながるかと思いました。

  * レビュー数がゼロになった場合、チェックされている複数商品の中で一部がゼロになるのでしょうか、それとも全てがゼロになるのでしょうか。

  * スクリプトはどのようなトリガーで動作させているのでしょうか。

レビュー数がゼロになった際の状況が不明だったためテストはできていないのですが、getActiveSheet()メソッドを使用せずに下記のように直接シートIDを指定するという方法はいかがでしょうか。

```

    var ss = SpreadsheetApp.openById('シートID');
    
```

スクリプトの実行内容には違いがあるかと思いますが、以前、Container-bound
Scriptであってもトリガーで使用する際はgetActiveSheet()ではなく直接シートIDを指定する方がエラーが少ない経験がありましたので、これが解決につながればと思いました。
CC BY-SA 3.0
2017-01-20T06:54:31.843
32016
2017-01-20T06:54:31.843
19460
31986
answer
> うまく動くときと動かないときがあります。

Amazon はSpreadSheet からのデータダウンロードのアクセスをうまくいったりうまくいかなかったりさせることによって防止しているので  
SpreadSheetのGASでのスクレイピングは現実的ではないと思います。

クライアント側のブラウザ操作させる、そしてそれを何台かのPCに分散させる、みたいなことで実現する方がより効果的に思います。
CC BY-SA 4.0
2019-05-14T16:28:53.030
54953
2019-05-14T16:28:53.030
21047
31986
answer