在Google Apps脚本中,我在项目中有这段代码发送推文(also in jsBin):
function sendTweet(status) {
var twitterKeys= {
TWITTER_CONSUMER_KEY: "x",
TWITTER_CONSUMER_SECRET: "x",
TWITTER_ACCESS_TOKEN: "x",
TWITTER_ACCESS_SECRET: "x"
};
var props = PropertiesService.getScriptProperties();
props.setProperties(twitterKeys);
twit = new Twitter.OAuth(props);
var service = new Twitter.OAuth(props);
if ( service.hasAccess() ) {
var response = twit.sendTweet(status);
if (response) {
Logger.log("Tweet ID " + response.id_str);
} else {
// Tweet could not be sent
// Go to View -> Logs to see the error message
}
}
}
sendTweet("test");
但我遇到的问题是我收到了这个错误:
TypeError: Cannot read property "text" from undefined. (line 293, file "twitter", project "Twitter lib")
第293行来自"Twitter lib" library(MKvHYYdYA4G5JJHj7hxIcoh8V4oX7X1M_)的第21版。
消息" test"尽管有这个错误,实际上也会收到推文。有谁知道如何解决它?
答案 0 :(得分:2)
嗨,Twitter Lib的作者。 @Mogsdad在Twitter上指出了我。我想我知道你的剧本发生了什么,这是Google Script工作原理的一个特点。
您的大部分代码都在一个带参数的函数中,然后您可以在脚本的顶层调用该函数。当您进入“运行”菜单并选择sendTweet
功能时,顶级脚本在执行所选功能之前运行会发生什么,并且推文会当时用“测试”文本发送。
然后,sendTweet
运行时没有参数,这意味着status
变量为undefined
。您正在向twit.sendTweet()
发送未定义的值,导致您看到的错误。
我在这里推荐的只是将最后一行代码包装到一个函数中,以便您可以从“运行”菜单中调用它,如下所示:
function sendTestTweet() {
sendTweet("test");
}
答案 1 :(得分:1)
回顾一下,您看到的错误是:
TypeError:无法从undefined中读取属性“text”。 (第293行,文件“twitter”,项目“Twitter lib”)
这是the library的sendTweet()
方法,见下文。
/**
* Upload a tweet to Twitter with optional media.
*
* @param {string | Tweet} tweet the status text to send as a Twitter update
* @param {optional object} params any additional parameters to send as part of the update post
* @return {object} the Twitter response as an object if successful, null otherwise
*/
OAuth.prototype.sendTweet = function(tweet, params) {
var i;
var payload = { //<=== 293
"status" : (tweet.text || tweet)
};
您的代码使用单个字符串参数status
调用此方法,该参数设置为“test”。
库的作者允许tweet
参数成为以下两种情况之一:
text
属性的对象,或但是,正在处理的方式首先检查tweet.text
,如果不存在则检查字符串tweet
。当tweet.text
不存在时(即仅使用字符串时),将抛出该TypeError。
我已经联系了图书馆作者,因此他们可以发布修复程序。但是,在此期间,您可以发送带有Tweet
属性的text
对象,或者获取该库的副本并自行更新。
发送Tweet对象。 Tweet对象记录在Twitter API v1.1 documentation中,但由于此操作中涉及的唯一属性是text
,因此只需更改你的status
函数可以解决问题。只需确保status
是具有text
属性的对象。
function sendTweet(status) {
if (typeof status === string)
status = {text:status};
...
自行更新库。 为避免错误,并正确处理参数选项,库中的第294行应为:
"status" : (tweet.hasOwnProperty("text") ? tweet.text : tweet)
或者:
"status" : (typeof tweet === 'object' ? tweet.text : tweet)
您需要发布它,并更新代码中的库ID,但这应该解决这个问题。库更新可用后,您可以切换回来。