在上一篇文章中,我们基于一位用户发送的 VBA 参考构建了一个功能完善的 ONLYOFFICE 宏。今天,我们想再进一步,为其添加一些 Whois API 功能。
什么是 ONLYOFFICE 宏
如果您是一名资深 Microsoft Excel 用户,那么相信您已对于 VBA 宏非常熟悉了。这些宏是帮助您自动执行日常任务的小型脚本。无论是重构数据,还是在单元格区域中插入多个值。ONLYOFFICE 宏的基础是 JavaScript 语法与文档生成器 API 方法。基于 JavaSript 的宏易于使用,具有跨平台特性且十分安全。这就使得其与 VBA 相比有着显著的优势。
关于 Whois
Whois 是 “Who is?”(是谁?)的简写,是一个基础互联网协议,用户可以使用它来获取关于域名和 IP 地址的详尽信息。它可以是一大有价值的资源,用于检索关于注册所有者、管理和技术联系人、注册和到期日期、域名服务器,甚至是负责域名注册的组织的详细信息。
访问 API
我们使用 API Ninijas 提供的解决方案来访问 Whois API。
API Ninjas 网站是一个在线平台,提供 API 相关的各种资源与分析。它还提供一系列免费 API,供开发人员在项目中使用。该网站旨在成为一个实用的目标平台,供开发者寻找信息、工具和实际示例,助其提高 API 开发技能。
该平台提供帮助发出 HHTP 请求的代码片段:
var domain = 'example.com'
$.ajax({
method: 'GET',
url: 'https://api.api-ninjas.com/v1/whois?domain=' + domain,
headers: { 'X-Api-Key': 'your_API_key'},
contentType: 'application/json',
success: function(result) {
console.log(result);
},
error: function ajaxError(jqXHR) {
console.error('Error: ', jqXHR.responseText);
}
});
构建宏
现在,我们将这个 .ajax 请求合并到我们的宏里面!我们代码的前几行保持不变,除了我们检索单元格 A4 的值这一部分。这次,单元格 A2 的值就够了:
var sheet = Api.GetActiveSheet();
var domainValue = sheet.GetRange("A2").GetValue();
var dateRange = sheet.GetRange("D1:D10");
然后,我们向 apiUrl 变量中指定的 API 端点发起一个 GET 请求:
$.ajax({
method: 'GET',
url: apiUrl,
headers: { 'X-Api-Key': 'your_API_key' },
contentType: 'application/json',
success: function(result) {
console.log(result);
API 响应成功后,我们继续处理数据。我们使用 JavaScript 的 Date 对象,将 UNIX 时间戳的创建日期、到期日期和更新日期转换为简单易读的格式。这些格式设置好的日期会被存储在 formattedCreationDate、formattedExpirationDate 和 formattedUpdatedDate 等变量中:
// Convert creation_date to a more readable format
var unixTimestamp = result.creation_date;
var creationDate = new Date(unixTimestamp * 1000);
var formattedCreationDate = creationDate.toDateString();
// Convert expiration_date to a more readable format
var expirationTimestamp = result.expiration_date;
var expirationDate = new Date(expirationTimestamp * 1000);
var formattedExpirationDate = expirationDate.toDateString();
// Convert updated_date to a more readable format
var updatedTimestamp = result.updated_date;
var updatedDate = new Date(updatedTimestamp * 1000);
var formattedUpdatedDate = updatedDate.toDateString();
为使用检索到的域信息填充电子表格,我们对 dateRange 变量使用 forEach 循环。这个循环会遍历指定区域 (D1:D10) 内的每个单元格。在循环内,我们使用 range.GetRow() 检索当前行并将其存储在 row 变量中:
var oRange = sheet.GetRange("E" + row);
然后,我们使用 sheet.GetRange(“E” + row) 为 E 列中相应的单元格创建一个范围对象,并将其分配给 oRange 变量:
var currentValue = range.GetValue();
基于 currentValue 的值,我们使用 switch 语句来确定相应的操作。例如,如果 currentValue 是“域名”,我们使用 oRange.SetValue(result.domain_name) 将 result.domain_name 的值设置为相应的单元格:
switch (currentValue) {
case "domain name":
oRange.SetValue(result.domain_name);
break;
同样,我们来处理其他事项,如注册商、whois 服务器、更新日期、创建日期、到期日期、域名服务器和 dnssec:
oRange.SetValue(result.registrar);
break;
case "whois server":
oRange.SetValue(result.whois_server);
break;
case "updated date":
oRange.SetValue(formattedUpdatedDate);
break;
case "creation date":
oRange.SetValue(formattedCreationDate);
break;
case "expiration date":
oRange.SetValue(formattedExpirationDate);
break;
case "name servers":
oRange.SetValue(result.name_servers.join(", "));
break;
case "dnssec":
oRange.SetValue(result.dnssec);
break;
default:
// Handle other cases if needed
break;
}
});
最后,我们定义一个重新加载函数,这个函数在循环完成后调用 Api.asc_calculate(Asc.c_oAscCalculateType.All) 方法来对电子表格做重新计算。这可以确保新填充的值反映在电子表格中:
reload(); // Invoke reload function after the loop is completed
},
error: function ajaxError(jqXHR) {
console.error('Error: ', jqXHR.responseText);
}
});
function reload() {
let reloadInterval = setInterval(function() {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
}, 100);
}
整个宏代码如下:
(function()
{
var sheet = Api.GetActiveSheet();
var domainValue = sheet.GetRange("A2").GetValue();
var dateRange = sheet.GetRange("D1:D10");
var apiUrl = 'https://api.api-ninjas.com/v1/whois?domain=' + domainValue;
$.ajax({
method: 'GET',
url: apiUrl,
headers: { 'X-Api-Key': 'your_API_key' },
contentType: 'application/json',
success: function(result) {
console.log(result);
// Convert creation_date to a more readable format
var unixTimestamp = result.creation_date;
var creationDate = new Date(unixTimestamp * 1000);
var formattedCreationDate = creationDate.toDateString();
// Convert expiration_date to a more readable format
var expirationTimestamp = result.expiration_date;
var expirationDate = new Date(expirationTimestamp * 1000);
var formattedExpirationDate = expirationDate.toDateString();
// Convert updated_date to a more readable format
var updatedTimestamp = result.updated_date;
var updatedDate = new Date(updatedTimestamp * 1000);
var formattedUpdatedDate = updatedDate.toDateString();
dateRange.ForEach(function(range) {
var row = range.GetRow();
var oRange = sheet.GetRange("E" + row);
var currentValue = range.GetValue();
switch (currentValue) {
case "domain name":
oRange.SetValue(result.domain_name);
break;
case "registrar":
oRange.SetValue(result.registrar);
break;
case "whois server":
oRange.SetValue(result.whois_server);
break;
case "updated date":
oRange.SetValue(formattedUpdatedDate);
break;
case "creation date":
oRange.SetValue(formattedCreationDate);
break;
case "expiration date":
oRange.SetValue(formattedExpirationDate);
break;
case "name servers":
oRange.SetValue(result.name_servers.join(", "));
break;
case "dnssec":
oRange.SetValue(result.dnssec);
break;
default:
// Handle other cases if needed
break;
}
});
reload(); // Invoke reload function after the loop is completed
},
error: function ajaxError(jqXHR) {
console.error('Error: ', jqXHR.responseText);
}
});
function reload() {
let reloadInterval = setInterval(function() {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
});
}
})();
我们来运行这个宏,点击这里,看看它是如何工作的!
ONLYOFFICE 文档免费在线宏课程
近期,我们将开始发布有关 ONLYOFFICE 解决方案的免费视频课程。首个视频课程将关注 ONLYOFFICE 文档中的宏,现已在 YouTube 上提供。
本课程分为 4 节,每节时长大约在 5-10 分钟。您将了解宏的工作原理,以及一些实际的例子。为了方便起见,我们还在视频描述中添加了时间戳 – 只需点击一下即可转到您感兴趣的主题。
阅读这篇文章,了解更多。
我们希望这个宏经实践检验,对您的项目颇有帮助,让您能高效检索和显示重要的网域详情。ONLYOFFICE API 灵活方便、功能实用,为任务的自定义和自动化开启无限可能。
我们欢迎您探索 ONLYOFFICE API 的潜力,构建自己的宏,释放无限创造力。欢迎提出问题或分享您的想法,欢迎发表评论或联系我们。我们乐意倾听您的想法,热切希望与您合作。祝好运!
相关链接
将 Microsoft Office 宏转换为 ONLYOFFICE 宏
ONLYOFFICE API 文档
宏示例
GitHub 上的 ONLYOFFICE