使用 Google Scripts 从 Google 表格自动发送每日推文
请访问我的博客查看更多文章,或访问我的GitHub获取我的免费 JavaScript 电子书,其中涵盖了从 ES6 到 2019 年的所有新特性。
我的女朋友运营着一个越南语博客(你一定要去看看,这是一个用 Gatsby 构建的静态网站,由她设计,我搭建),我想帮助她启动一个推特每日一词项目。
每天都要上推特发布一个新词,这并不理想;重复性任务最糟糕,它们既无聊又浪费时间,而这些时间本来可以用来做其他事情。
这就是为什么我编写了一个简单的 Google 脚本,每天从 Google 表格自动发布一条新推文。整个过程不到 2 小时,而我之前对如何使用 Google 脚本一无所知(如果你熟悉 JavaScript,它其实非常容易上手)。
在本教程结束时,您将知道如何创建一个脚本,从 Google 表格中获取行并将其作为推文发送。
您可以在这里获取脚本的完整代码。
首先,在开始之前,我们需要一个推特开发者账号,请点击此链接进行注册。
申请提交后,大约需要几个小时才能获得批准。
之后,您需要创建一个新的应用程序,并保存消费者 API 密钥、访问令牌和访问令牌密钥。切记不要与任何人分享这些信息!
在您的申请仍在等待 Twitter 批准期间,让我们开始创建 Google 表格吧:
这是一个简单的表格,包含 4 列:3 列用于填写内容,1 列用于填写发布该推文的日期。
现在,在 Google 表格中,点击“工具” > “脚本编辑器”,将打开一个新窗口,您可以在其中编写 Google 脚本。
在开始编写代码之前,我们先导入所需的 Twitter 库。为此,您需要点击“资源” > “库” ,然后将以下代码粘贴到“添加库”字段中: MKvHYYdYA4G5JJHj7hxIcoh8V4oX7X1M_。
在保存之前,将库的标识符重命名为Twitter,这样我们就可以调用库上的方法Twitter.而不是库上的方法Twitterlib.,这不是必须的,只是个人偏好。
编写 Google 脚本
现在终于到了编写剧本的时候了,我们可以将剧本分为两部分:
- 解析 Google 表格内容,获取正确的行并构建我们的推文
- 验证 Twitter 账号并转发我们的帖子
我的谷歌表格结构是这样的:我每天都可以发布一条不同的每日一词推文。
我首先需要做的是解析 Google 表格的内容,找到今天要发布的正确行。
首先,让我们把表格整理成这样:
function sendDailyTweet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var startRowNumber = 1;
var endRowNumber = sheet.getLastRow();
}
现在我们要做的就是遍历所有行,看看该行的日期是否与今天相符。
我们的函数现在看起来会是这样:
function sendDailyTweet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var startRowNumber = 1;
var endRowNumber = sheet.getLastRow();
// variables to create our tweet
var vietnameseWord;
var englishWord;
var sentenceExample;
var identifier;
for (var currentRowNumber = startRowNumber; currentRowNumber <= endRowNumber; currentRowNumber++) {
var row = sheet.getRange(currentRowNumber + ":" + currentRowNumber)
.getValues();
// check that the fourth column (Date) is equal to today
if (isToday(row[0][3])) {
console.log(row);
break;
}
}
}
我们现在要做的是遍历每一行,并用以下方法获取其内容sheet.getRange(currentRowNumber + ":" + currentRowNumber).getValues();。
我们得到的是一个Array包含Array多个值的数组,每列一个值。
由于日期存储在第 4 列,我是这样获取的:row[0][3]并将其作为参数传递给isToday我们可以在主函数之外定义的函数:
function isToday(date) {
var today = new Date();
var dateFromRow = new Date(date);
return dateFromRow.getDate() == today.getDate() &&
dateFromRow.getMonth() == today.getMonth() &&
dateFromRow.getFullYear() == today.getFullYear()
}
这个函数非常简单,它可以帮助我们比较当前日期和存储在特定行中的日期。如果它们匹配,则返回true
console.log如果您现在尝试运行您的代码,一切都应该正常,您可以通过单击菜单“视图” > “堆栈驱动程序日志记录”来查看输出。
现在,请将其替换console.log为以下几行:
vietnameseWord = row[0][0];
englishWord = row[0][1];
sentenceExample = row[0][2];
identifier = currentRowNumber -1;
我们只是根据相应的列,为所有需要的变量赋值。
希望Twitter现在已经批准了你的请求,这样你就可以继续实现这段代码的最后一部分了。
在https://developer.twitter.com/上创建新应用后,请在函数Object内部定义一个新的sendDailyTweet变量,并将我的占位符替换为您自己的键:
var twitterKeys = {
TWITTER_CONSUMER_KEY: "[your_key_here]",
TWITTER_CONSUMER_SECRET: "[your_key_here]",
TWITTER_ACCESS_TOKEN: "[your_key_here]",
TWITTER_ACCESS_SECRET: "[your_key_here]",
}
接下来,就在下方,Object让我们像这样存储这些属性:
var props = PropertiesService.getScriptProperties();
props.setProperties(twitterKeys);
// we don't really need params for this example so we'll leave them empty
var params = new Array(0);
var service = new Twitter.OAuth(props);
请看这里:new Twitter.OAuth(props);,我们之所以调用,Twitter.是因为我们将库的标识符重命名为Twitter,否则它将是Twitterlib.。
最后一步是对推文进行身份验证并最终发送推文。
在循环结束后for,我们添加以下代码if...else:
if (!service.hasAccess()) {
console.log("Authentication Failed");
} else {
console.log("Authentication Successful");
}
现在尝试运行你的代码,如果你传入的凭据props.setProperties(twitterKeys);正确,应该不会有任何问题。
我们将在声明内部else构建推文并发送:
var status = "Vietnamese Word #" + identifier + "\n\n" +
vietnameseWord + " - " + englishWord + "\n\n" + "E.g: " +
sentenceExample + "\n\n" +
"Comment with your sentence. Learn more @ elingos.com" +
"\n\n" +
"#wordoftheday #languagelearning #learnvietnamese #vietnameselanguage #elingosvietnamese";
try {
var response = service.sendTweet(status, params);
console.log(response);
} catch (e) {
console.log(e)
}
我们使用上面定义的变量来创建推文的状态。
在我们的代码中,try...catch我们尝试使用 `@send` 发送推文service.sendTweet(status, params);,否则我们将在控制台中看到记录的错误。
太棒了,我们已经完成了 Google Script 部分,现在唯一缺少的就是一个触发器,让我们的脚本每天运行。
为此,我们无需编写任何代码,只需从菜单中单击“编辑” > “当前项目的触发器”,即可打开一个新标签页。
点击右下角的“添加触发器”按钮
以下是我为脚本选择的设置:
sendDailyTweet作为要运行的函数- 以时间驱动的事件源
- 日间定时器 - 时间段为凌晨 1 点至 2 点
这个脚本每天都会运行,并在Elingos的 Twitter 账号上发布一条新推文。如果你喜欢语言,是真正的语言,而不仅仅是编程语言,并且你想学习一门新语言,请访问她的博客Elingos.com。
您可以在这里获取脚本的完整代码。
如果你想学习更复杂的脚本,请查看Medium上的这篇精彩文章。
非常感谢您的阅读。欢迎在DevTo或我的博客inspiredwebdev上关注我,获取更多内容。

我的电子书已在亚马逊和Leanpub上架。


