如何使用宏将 YouTube 搜索结果插入电子表格
该宏将 YouTube 搜索结果集成到 ONLYOFFICE 电子表格编辑器中。通过嵌入 YouTube 搜索功能,它提供了一种利用多媒体内容丰富电子表格的便捷解决方案。让我们看看如何构建宏。
关于API
对于这个宏,我们正在集成 RapidAPI 的功能来简化我们的数据检索过程。使用 XMLHttpRequest 功能,我们可以使用 RapidAPI 提供的代码片段定义目标 URL 并设置标头。我们决定使用 Marin Delija 的 YouTube 搜索结果 API 参考。这是一个理想的选择,因为基本计划是免费的,每天可以处理 100 个请求。此外,如果我们需要增加您的请求,还可以提供付费计划。这是一个平衡每个人的需求和预算的实用选择!
如果您已经是 RapidAPI 社区的一员,只需点击上面的链接并订阅 API 参考即可。对于新用户,注册过程很简单 – 只需提供您的电子邮件地址,然后就可以开始了!
构建宏
const data = null;
const oWorksheet = Api.GetActiveSheet();
let query = []; // empty query array to store the queries
这些行检索 ONLYOFFICE 电子表格中的活动工作表并将其分配给变量 oWorksheet。我们还初始化一个空数组查询,它将存储要搜索的查询。
// Takes the queries from the cells A1, A2, and A3.
for (let i = 1; i < 4; i++) {
const value = String(oWorksheet.GetRange("A" + i).GetValue());
if (value !== null && value.length !== 0) {
query.push(value);
}
}
该 for 循环遍历单元格 A1 到 A3,获取值。如果值存在且不为空,则会将其附加到查询数组中。
// polpulates the cells with the titles and links from the queries
function populate(count, title, link) {
let nRowTitle = 9;
for (let j = 0; j < title.length; j++) {
let passedTitleCount = count * 3;
const text = JSON.stringify(title[j]);
const textWithoutQuotes = text.replace(/"/g, "");
oWorksheet.GetRangeByNumber(nRowTitle - 1, passedTitleCount).SetValue(query[count]);
oWorksheet.GetRangeByNumber(nRowTitle - 1, passedTitleCount).SetAlignHorizontal("center");
oWorksheet
.GetRangeByNumber(nRowTitle + j, passedTitleCount)
.SetValue(textWithoutQuotes);
oWorksheet
.GetRangeByNumber(nRowTitle + j, passedTitleCount)
.AutoFit(false, true);
}
let nRowLink = 9;
for (let h = 0; h < link.length; h++) {
let passedLinkCount = count * 3 + 1;
const text = JSON.stringify(link[h]);
const textWithoutQuotes = text.replace(/"/g, "");
oWorksheet
.GetRangeByNumber(nRowLink + h, passedLinkCount)
.SetValue(textWithoutQuotes);
oWorksheet
.GetRangeByNumber(nRowLink + h, passedLinkCount)
.AutoFit(false, true);
}
}
乍一看,填充函数可能看起来很复杂,但它并不复杂。populate 函数采用三个参数:count、title 和 link。根据计数,它会用结果填充电子表格中的相应单元格。它有两个 for 循环;一个帮助填充标题,而另一个 for 循环填充标题旁边的链接。
// refreshes the values in all the cells of the spreadsheet
function reloadCellValues() {
let reload = setTimeout(function () {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
}, 5000);
}
在这一部分中,我们定义了一个函数 reloadCellValues,它使用 setTimeout 在 5 秒延迟后刷新电子表格中的所有单元格值。
for (let count = 0; count < query.length; count++) {
const url = `https://youtube-search-results.p.rapidapi.com/youtube-search/?q=${query[count]}`;
const xhr = new XMLHttpRequest();
xhr.onload = function () {
const apiData = JSON.parse(this.response);
const { videos: results } = apiData;
const title = results.map((i) => i.title);
const link = results.map((i) => i.link);
populate(count, title, link);
};
在这里,我们使用 for 循环迭代查询数组中存储的每个查询,向 RapidAPI 发出后续请求。我们在 url 变量中定义一个动态 URL。常量 xhr 使用 XMLHttpRequest 对象初始化。
通过 xhr.onload,我们为 XMLHttpRequest 成功完成其请求定义了一个事件处理程序。
在 onload 函数中,我们检索数据,然后解构对象以提取必要的值。
然后,我们使用 map 方法迭代所有标题和链接,将它们存储在两个数组中。然后,这些数组与计数一起传递给填充函数。
// XMLHttpRequest Code Snippets copied from RapidAPI
xhr.open("GET", url);
xhr.setRequestHeader(
"X-RapidAPI-Key",
YourApiKey
);
xhr.setRequestHeader(
"X-RapidAPI-Host",
"youtube-search-results.p.rapidapi.com"
);
xhr.send(data);
}
接下来,我们定义 XMLHttpRequest 的目标 URL 并配置请求的标头。该代码段是由 RapidAPI 从 XMLHttpRequest 提供的代码片段中提取的。您需要将“YourApiKey”替换为您的个人 API 密钥,该密钥可以在 RapidAPI 中找到。
reloadCellValues();
最终,我们调用之前定义的 reloadCellValues 方法。
完整的宏代码
以下是宏的完整代码。
(function () {
const data = null;
const oWorksheet = Api.GetActiveSheet();
let query = []; // empty query array to store the queries
// Takes the queries from the cells A1, A2, and A3.
for (let i = 1; i < 4; i++) {
const value = String(oWorksheet.GetRange("A" + i).GetValue());
if (value !== null && value.length !== 0) {
query.push(value);
}
}
// polpulates the cells with the titles and links from the queries
function populate(count, title, link) {
let nRowTitle = 9;
for (let j = 0; j < title.length; j++) {
let passedTitleCount = count * 3;
const text = JSON.stringify(title[j]);
const textWithoutQuotes = text.replace(/"/g, "");
oWorksheet
.GetRangeByNumber(nRowTitle - 1, passedTitleCount)
.SetValue(query[count]);
oWorksheet
.GetRangeByNumber(nRowTitle - 1, passedTitleCount)
.SetAlignHorizontal("center");
oWorksheet
.GetRangeByNumber(nRowTitle + j, passedTitleCount)
.SetValue(textWithoutQuotes);
oWorksheet
.GetRangeByNumber(nRowTitle + j, passedTitleCount)
.AutoFit(false, true);
}
let nRowLink = 9;
for (let h = 0; h < link.length; h++) {
let passedLinkCount = count * 3 + 1;
const text = JSON.stringify(link[h]);
const textWithoutQuotes = text.replace(/"/g, "");
oWorksheet
.GetRangeByNumber(nRowLink + h, passedLinkCount)
.SetValue(textWithoutQuotes);
oWorksheet
.GetRangeByNumber(nRowLink + h, passedLinkCount)
.AutoFit(false, true);
}
}
// refreshes the values in all the cells of the spreadsheet
function reloadCellValues() {
let reload = setTimeout(function () {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
}, 5000);
}
// for loop for multiple queries
for (let count = 0; count < query.length; count++) {
const url = `https://youtube-search-results.p.rapidapi.com/youtube-search/?q=${query[count]}`;
const xhr = new XMLHttpRequest();
xhr.onload = function () {
const apiData = JSON.parse(this.response);
const { videos: results } = apiData;
const title = results.map((i) => i.title);
const link = results.map((i) => i.link);
populate(count, title, link);
};
// XMLHttpRequest Code Snippets copied from RapidAPI
xhr.open("GET", url);
xhr.setRequestHeader("X-RapidAPI-Key", "YOUR API KEY GOES HERE");
xhr.setRequestHeader(
"X-RapidAPI-Host",
"youtube-search-results.p.rapidapi.com"
);
xhr.send(data);
}
reloadCellValues();
})();
让我们看看宏的实际效果。
我们希望该宏已被证明是有用的,可以将 YouTube 搜索结果数据直接无缝集成到您的电子表格中。
不要错过利用 ONLYOFFICE API 强大功能的机会。我们丰富的 API 方法库是将您的想法变为现实的关键。如果您有任何问题或创新概念,欢迎与我们分享。您的意见非常有价值,我们很高兴能够与您合作。祝您的探索之路好运!