INTEGRITY Dokumentace

DNS v Google Sheets

Vytvoření funkce

Tento tutoriál vytvoří vlastní funkci Google Sheets, která pomocí DNS over HTTPS (DoH), protokolu šifrujícího vyhledávání DNS přes HTTPS, odesílá dotazy na veřejný DNS resolver Cloudflare 1.1.1.1. Po nastavení můžete napsat vzorec jako =NSLookup("A", "example.com") do libovolné buňky a získáte záznamy DNS bez nutnosti opouštět tabulku. Hodí se to pro hromadné audity domén, plánování migrace nebo sledování změn DNS napříč velkým počtem domén najednou.

Nejprve otevřete svůj Google Sheet a vytvořte vlastní funkce v Google Apps Script ↗ s následujícím kódem:

function NSLookup(type, domain, useCache = false, minCacheTTL = 30) {
	// --- Parameter validation ---
	if (typeof type == "undefined") {
		throw new Error("Missing parameter 1 dns type");
	}

	if (typeof domain == "undefined") {
		throw new Error("Missing parameter 2 domain name");
	}

	if (typeof useCache != "boolean") {
		throw new Error("Only boolean values allowed in 3 use cache");
	}

	if (typeof minCacheTTL != "number") {
		throw new Error("Only numeric values allowed in 4 min cache ttl");
	}

	type = type.toUpperCase();
	domain = domain.toLowerCase();

	// --- Optional caching layer (uses Google Apps Script CacheService) ---
	let cache = null;
	if (useCache) {
		// Cache key and hash
		cacheKey = domain + "@" + type;
		cacheHash = Utilities.base64Encode(cacheKey);
		cacheBinKey = "nslookup-result-" + cacheHash;

		cache = CacheService.getScriptCache();
		const cachedResult = cache.get(cacheBinKey);
		if (cachedResult != null) {
			return cachedResult;
		}
	}

	// --- DNS-over-HTTPS query to Cloudflare's 1.1.1.1 resolver ---
	const url =
		"https://cloudflare-dns.com/dns-query?name=" +
		encodeURIComponent(domain) +
		"&type=" +
		encodeURIComponent(type);
	const options = {
		muteHttpExceptions: true,
		headers: {
			accept: "application/dns-json",
		},
	};

	const result = UrlFetchApp.fetch(url, options);
	const rc = result.getResponseCode();
	const resultText = result.getContentText();

	if (rc !== 200) {
		throw new Error(rc);
	}

	// --- Standard DNS response codes ---
	const errors = [
		{ name: "NoError", description: "No Error" }, // 0
		{ name: "FormErr", description: "Format Error" }, // 1
		{ name: "ServFail", description: "Server Failure" }, // 2
		{ name: "NXDomain", description: "Non-Existent Domain" }, // 3
		{ name: "NotImp", description: "Not Implemented" }, // 4
		{ name: "Refused", description: "Query Refused" }, // 5
		{ name: "YXDomain", description: "Name Exists when it should not" }, // 6
		{ name: "YXRRSet", description: "RR Set Exists when it should not" }, // 7
		{ name: "NXRRSet", description: "RR Set that should exist does not" }, // 8
		{ name: "NotAuth", description: "Not Authorized" }, // 9
	];

	const response = JSON.parse(resultText);

	if (response.Status !== 0) {
		return errors[response.Status].name;
	}

	// --- Extract answer records and determine cache TTL ---
	const outputData = [];
	let cacheTTL = 0;

	for (const i in response.Answer) {
		outputData.push(response.Answer[i].data);
		const ttl = response.Answer[i].TTL;
		cacheTTL = Math.min(cacheTTL || ttl, ttl);
	}

	const outputString = outputData.join(",");

	if (useCache) {
		cache.put(cacheBinKey, outputString, Math.max(cacheTTL, minCacheTTL));
	}

	return outputString;
}

Používání 1.1.1.1

Když zavoláte NSLookup funkci s typem záznamu a doménou zobrazí buňka odpovídající hodnotu záznamu DNS, tedy data (například IP adresu), která DNS pro danou doménu a typ záznamu vrací.

Úplná signatura funkce je:

=NSLookup(type, domain, useCache, minCacheTTL)

Parametr Povinné Výchozí Popis
type Ano , Typ DNS záznamu, na který se dotázat (například A, AAAA, MX).
domain Ano , Název domény, kterou chcete vyhledat.
useCache Ne false Nastavte na true k ukládání výsledků do mezipaměti pomocí služby CacheService v Google Apps Script, což omezuje opakované vyhledávání DNS ve velkých tabulkách.
minCacheTTL Ne 30 Minimální doba platnosti cache v sekundách. Skutečná hodnota TTL odpovídá vyšší z této hodnoty a TTL vrácené v DNS odpovědi.

Podporované typy záznamů DNS

Například pokud buňka B1 obsahuje A (typ záznamu) a B2 obsahuje example.com (doména) a do jiné buňky zadejte tento vzorec:

=NSLookup(B1, B2)

V závislosti na regionálním nastavení může být potřeba jako oddělovač argumentů použít středník:

=NSLookup(B1; B2)
Buňka Google Sheets obsahující vzorec NSLookup

Vrací A záznam pro danou doménu:

198.41.214.162, 198.41.215.162
Buňka Google Sheets zobrazující výsledek vyhledávání DNS