2022年2月22日火曜日

Googleスプレッドシートに書かれたデータに関してWEBからデータを取得する

サンプルとしてGoogle Apps Scriptでスプレッドシートに書かれた郵便番号から住所を調べるスクリプトを作成した。郵便番号を取得するなら別の方法をお勧めする、あくまでGASの使い方説明の素材にしただけです。
エラー処理などを皆無だし、HTMLから必要なデータを抽出する部分も適当です。
スプレッドシートなどから呼び出した際にすぐに処理を抜けたい場合はstart関数を呼び出す、いきなり処理したい場合やデバッグ時はzipSearch関数を呼び出す。5分経過したらいったん中断し、1分後に処理を再開しまう。

A:B列を取得してB列が空の行のみを処理します。すべて処理が終わるか5分経過するかで結果をスプレッドシートに書き込みます。都度書き込むとAPI呼び出し回数が増え、処理も遅くなります。


function start(){
  // 1分後にスタート
  setTrigger("zipSearch");
}
function zipSearch() {
  // 一旦トリガを削除
  clearTrigger( arguments.callee.name );
  // スクリプト実行開始時間を取得(6分制限用)
  var StartTime   = new Date();

  // シートから入出力部分を取得
  // A列に郵便番号(”222-0001”)が入力されており、対応する住所をB列に入力する
  let ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  let range = ss.getRange(1,1,ss.getLastRow(),2);
  let values = range.getValues();

  // 一行ずつ処理を実施
  values.forEach( row =>{
    if( row[0] != "" && row[1] == "" )
    {
      let url = "https://www.post.japanpost.jp/cgi-zip/zipcode.php?zip="+row[0];

      // 今回は<td class="data"><small>.*?</small></td>を抽出して処理
      let table = UrlFetchApp.fetch(url)
                  .getContentText()
                  .match(/<td class="data"><small>.*?<\/small><\/td>/gis)
     if( table!=null )
     {
       // 結合しタグを削除
       row[1] = table.join(" ").replace(/<.*?>/gis,"");
     }
     else
     {
       row[1] = "error";
     }
    }
    // スクリプト開始から5分経過したら一旦終了
    var CurrentTime = new Date();
    if( (CurrentTime - StartTime) > 5*60*1000 ){
      // 結果をシートに書き戻す
      range.setValues(values);
      //トリガをセットして終了
      setTrigger(arguments.callee.name);
      return;
    }
  });
  // 結果をシートに書き戻す
  range.setValues(values);
}

function setTrigger(func)
{
  trigger = ScriptApp.newTrigger(func)
            .timeBased()
            .everyMinutes(1)
            .create();
}

function clearTrigger(func)
{
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach( trigger=>{
    if( trigger.getHandlerFunction() == func )
    {
      ScriptApp.deleteTrigger(trigger);
    }
  });
}

0 件のコメント:

コメントを投稿

質問、要望、指摘など書いていただいてもよいですが、対応できるとは限りませんのでご了承ください。私に対するものも含め他の人を嫌な気分になるようなコメントは避けてください。