タイトルの通りなのだけど、ドメインのリストからネームサーバーを調べて、結果をスプレッドシートに出力するGASを書いた。きっとシェルとかでやるようなことだと思うけど、ググったらこのページがヒットしたので、GASでもできるならと試してみた。
サンプルは単独のドメインを調べるスクリプトだったので、複数ドメインを一括で処理できるように書き換えた。
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()の使い所が分かったので学びがあった。