ドメインからネームサーバーをしらべてスプレッドシートに記録するGAS

タイトルの通りなのだけど、ドメインのリストからネームサーバーを調べて、結果をスプレッドシートに出力するGASを書いた。きっとシェルとかでやるようなことだと思うけど、ググったらこのページがヒットしたので、GASでもできるならと試してみた。

A列にドメインを用意して、スクリプトを実行するとB列にネームサーバーが記録される

サンプルは単独のドメインを調べるスクリプトだったので、複数ドメインを一括で処理できるように書き換えた。

function openSheet(sheetName) {
  var spreadsheet = SpreadsheetApp.openById('ここにスプレッドシートのID');
  return spreadsheet.getSheetByName(sheetName); 
}


function checkNameServer() {

  var sheetURL = openSheet('URL');
  var data = sheetURL.getRange(2, 1, sheetURL.getLastRow() - 1).getValues();

  //二次元配列から配列に変換する
  var urls = [];
  for (var i=0; i<data.length; i++){
    urls.push(data[i][0]);
  }  

  urls.forEach(function(url,index,array) {
    var sheetURL = openSheet('URL');
    var api_url = 'https://dns.google.com/resolve'; 
    var type = 'NS'; 
    var name = url; 
    var requestUrl = api_url + '?name=' + name + '&type=' + type; // Build request URL
    var response = UrlFetchApp.fetch(requestUrl); 
    var responseText = response.getContentText(); 
    var json = JSON.parse(responseText); 

    //レスポンスがドメインによって違ったので、場合分け
    var answers = "";
    if(json.Answer) {
      answers = json.Answer.map(function(ans){return ans.data}).join(','); // Get the values
    }else if(json.Authority){
      answers = json.Authority.map(function(ans){return ans.data}).join(','); // Get the values
    }else {
    }

    //結果をシートに反映
    sheetURL.getRange(index+2, 2).setValue(answers);

    //100件ごとにシートを再描画する
    if(index%100 === 0) {
      SpreadsheetApp.flush();
    }
    
  });

}

foreachが終わらないとスプレッドシートが更新されないので、対象のドメインが大量だとだいぶ待つことになる。そこで、SpreadsheetApp.flush(); で100件単位くらいで再描画するようにした。

flush()の使い所が分かったので学びがあった。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください