发布于 2026-01-05 6 阅读
0

使用 Google Scripts 从 Google 表格自动发送每日推文

使用 Google Scripts 从 Google 表格自动发送每日推文

请访问我的博客查看更多文章,或访问我的GitHub获取我的免费 JavaScript 电子书,其中涵盖了从 ES6 到 2019 年的所有新特性。

 

我的女朋友运营着一个越南语博客(你一定要去看看,这是一个用 Gatsby 构建的静态网站,由她设计,我搭建),我想帮助她启动一个推特每日一词项目。

每天都要上推特发布一个新词,这并不理想;重复性任务最糟糕,它们既无聊又浪费时间,而这些时间本来可以用来做其他事情。

这就是为什么我编写了一个简单的 Google 脚本,每天从 Google 表格自动发布一条新推文。整个过程不到 2 小时,而我之前对如何使用 Google 脚本一无所知(如果你熟悉 JavaScript,它其实非常容易上手)。

在本教程结束时,您将知道如何创建一个脚本,从 Google 表格中获取行并将其作为推文发送

您可以在这里获取脚本的完整代码。

首先,在开始之前,我们需要一个推特开发者账号,请点击此链接进行注册。

申请提交后,大约需要几个小时才能获得批准。
之后,您需要创建一个新的应用程序,并保存消费者 API 密钥、访问令牌和访问令牌密钥。切记不要与任何人分享这些信息!

在您的申请仍在等待 Twitter 批准期间,让我们开始创建 Google 表格吧:

Google 表格

这是一个简单的表格,包含 4 列:3 列用于填写内容,1 列用于填写发布该推文的日期。

现在,在 Google 表格中,点击“工具” > “脚本编辑器”,将打开一个新窗口,您可以在其中编写 Google 脚本。

在开始编写代码之前,我们先导入所需的 Twitter 库。为此,您需要点击“资源” > “库” ,然后将以下代码粘贴到“添加库”字段中: MKvHYYdYA4G5JJHj7hxIcoh8V4oX7X1M_

Google 脚本库

在保存之前,将库的标识符重命名为Twitter,这样我们就可以调用库上的方法Twitter.而不是库上的方法Twitterlib.,这不是必须的,只是个人偏好。

 

编写 Google 脚本

现在终于到了编写剧本的时候了,我们可以将剧本分为两部分:

  • 解析 Google 表格内容,获取正确的行并构建我们的推文
  • 验证 Twitter 账号并转发我们的帖子

我的谷歌表格结构是这样的:我每天都可以发布一条不同的每日一词推文。

我首先需要做的是解析 Google 表格的内容,找到今天要发布的正确行。

首先,让我们把表格整理成这样:

function sendDailyTweet() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    var startRowNumber = 1;
    var endRowNumber = sheet.getLastRow();
}
Enter fullscreen mode Exit fullscreen mode

现在我们要做的就是遍历所有行,看看该行的日期是否与今天相符。

我们的函数现在看起来会是这样:

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;
            }
        }
}
Enter fullscreen mode Exit fullscreen mode

我们现在要做的是遍历每一行,并用以下方法获取其内容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()
}
Enter fullscreen mode Exit fullscreen mode

这个函数非常简单,它可以帮助我们比较当前日期和存储在特定行中的日期。如果它们匹配,则返回true

console.log如果您现在尝试运行您的代码,一切都应该正常,您可以通过单击菜单“视图” > “堆栈驱动程序日志记录”来查看输出

现在,请将其替换console.log为以下几行:

vietnameseWord = row[0][0];
englishWord = row[0][1];
sentenceExample = row[0][2];
identifier = currentRowNumber -1;
Enter fullscreen mode Exit fullscreen mode

我们只是根据相应的列,为所有需要的变量赋值。

希望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]",  
  }
Enter fullscreen mode Exit fullscreen mode

接下来,就在下方,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);
Enter fullscreen mode Exit fullscreen mode

请看这里:new Twitter.OAuth(props);,我们之所以调用,Twitter.是因为我们将库的标识符重命名为Twitter,否则它将是Twitterlib.

最后一步是对推文进行身份验证并最终发送推文。

在循环结束后for,我们添加以下代码if...else

if (!service.hasAccess()) {
    console.log("Authentication Failed");
  } else {
        console.log("Authentication Successful");
    }
Enter fullscreen mode Exit fullscreen mode

现在尝试运行你的代码,如果你传入的凭据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)
        }
Enter fullscreen mode Exit fullscreen mode

我们使用上面定义的变量来创建推文的状态。

在我们的代码中,try...catch我们尝试使用 `@send` 发送推文service.sendTweet(status, params);,否则我们将在控制台中看到记录的错误。

太棒了,我们已经完成了 Google Script 部分,现在唯一缺少的就是一个触发器,让我们的脚本每天运行。

为此,我们无需编写任何代码,只需从菜单中单击“编辑” > “当前项目的触发器”,即可打开一个新标签页。

点击右下角的“添加触发器”按钮

Google 脚本触发器

以下是我为脚本选择的设置:

  • sendDailyTweet作为要运行的函数
  • 以时间驱动的事件源
  • 日间定时器 - 时间段为凌晨 1 点至 2 点

这个脚本每天都会运行,并在Elingos的 Twitter 账号上发布一条新推文。如果你喜欢语言,是真正的语言,而不仅仅是编程语言,并且你想学习一门新语言,请访问她的博客Elingos.com

您可以在这里获取脚本的完整代码

如果你想学习更复杂的脚本,请查看Medium上的这篇精彩文章。


 

非常感谢您的阅读。欢迎在DevTo或我的博客inspiredwebdev上关注我,获取更多内容。


书籍横幅

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

文章来源:https://dev.to/albertomontalesi/send-daily-automated-tweets-from-a-google-sheet-by-using-google-scripts-820