gpt4 book ai didi

google-apps-script - 在 Gmail 插件中处理持久的特定于用户的值

转载 作者:行者123 更新时间:2023-12-02 00:55:52 25 4
gpt4 key购买 nike

我已经创建了简单的 Gmail 插件,现在我正在努力解决以下策略。

安装插件后,当第一个收件箱打开时,我们会要求用户输入基本信息,当他打开第二封邮件时,我们不会再次询问基本信息详细信息。

我该如何处理这个问题?

我尝试过属性(property)服务,但没有成功。

更新

var MAX_THREADS = 5;

/**
* Returns the array of cards that should be rendered for the current
* e-mail thread. The name of this function is specified in the
* manifest 'onTriggerFunction' field, indicating that this function
* runs every time the add-on is started.
*
* @param {Object} e data provided by the Gmail UI.
* @returns {Card[]}
*/
function buildAddOn(e) {
// Activate temporary Gmail add-on scopes.
//Logger.log('E', Session.getActiveUser());
var accessToken = e.messageMetadata.accessToken;
GmailApp.setCurrentMessageAccessToken(accessToken);
var userProperties = PropertiesService.getUserProperties();
var Token = userProperties.getProperty('Token');
Logger.log('Token value:',typeof Token);
if(Token != null ){
var messageId = e.messageMetadata.messageId;
var senderData = extractSenderData(messageId);
var cards = [];

// Build a card for each recent thread from this email's sender.
if (senderData.recents.length > 0) {
senderData.recents.forEach(function(threadData) {
cards.push(buildRecentThreadCard(senderData.email, threadData));
});
} else {
// Present a blank card if there are no recent threads from
// this sender.
cards.push(CardService.newCardBuilder()
.setHeader(CardService.newCardHeader()
.setTitle('No recent threads from this sender')).build());
}
return cards;
}
else{
var cards = []
var login_card = build_login_card()
cards.push(login_card);
return cards;
}
}

/**
* This function builds a set of data about this sender's presence in your
* inbox.
*
* @param {String} messageId The message ID of the open message.
* @return {Object} a collection of sender information to display in cards.
*/
function extractSenderData(messageId) {
// Use the Gmail service to access information about this message.
var mail = GmailApp.getMessageById(messageId);
var threadId = mail.getThread().getId();
var senderEmail = extractEmailAddress(mail.getFrom());

var recentThreads = GmailApp.search('from:' + senderEmail);
var recents = [];

// Retrieve information about up to 5 recent threads from the same sender.
recentThreads.slice(0,MAX_THREADS).forEach(function(thread) {
if (thread.getId() != threadId && ! thread.isInChats()) {
recents.push({
'subject': thread.getFirstMessageSubject(),
'count': thread.getMessageCount(),
'link': 'https://mail.google.com/mail/u/0/#inbox/' + thread.getId(),
'lastDate': thread.getLastMessageDate().toDateString()
});
}
});

var senderData = {
"email": senderEmail,
'recents': recents
};

return senderData;
}

/**
* Given the result of GmailMessage.getFrom(), extract only the email address.
* getFrom() can return just the email address or a string in the form
* "Name <myemail@domain>".
*
* @param {String} sender The results returned from getFrom().
* @return {String} Only the email address.
*/
function extractEmailAddress(sender) {
var regex = /\<([^\@]+\@[^\>]+)\>/;
var email = sender; // Default to using the whole string.
var match = regex.exec(sender);
if (match) {
email = match[1];
}
return email;
}

/**
* Builds a card to display information about a recent thread from this sender.
*
* @param {String} senderEmail The sender email.
* @param {Object} threadData Infomation about the thread to display.
* @return {Card} a card that displays thread information.
*/
function buildRecentThreadCard(senderEmail, threadData) {
var card = CardService.newCardBuilder();
card.setHeader(CardService.newCardHeader().setTitle(threadData.subject));
var section = CardService.newCardSection()
.setHeader("<font color=\"#1257e0\">Recent thread</font>");
section.addWidget(CardService.newTextParagraph().setText(threadData.subject));
section.addWidget(CardService.newKeyValue()
.setTopLabel('Sender')
.setContent(senderEmail));
section.addWidget(CardService.newKeyValue()
.setTopLabel('Number of messages')
.setContent(threadData.count.toString()));
section.addWidget(CardService.newKeyValue()
.setTopLabel('Last updated')
.setContent(threadData.lastDate.toString()));

var threadLink = CardService.newOpenLink()
.setUrl(threadData.link)
.setOpenAs(CardService.OpenAs.FULL_SIZE);
var button = CardService.newTextButton()
.setText('Open Thread')
.setOpenLink(threadLink);
section.addWidget(CardService.newButtonSet().addButton(button));

card.addSection(section);
return card.build();
}
function build_login_card(){
var card = CardService.newCardBuilder();
card.setHeader(CardService.newCardHeader().setTitle("Login Here"));
var userProperties = PropertiesService.getUserProperties();
var Token = userProperties.setProperty('Token',"Token");
return card.build()
}

最佳答案

根据评论,这里的主要问题是卸载附加组件不会从 UserProperties 数据存储中删除位,因此如果重新安装附加组件,则无法再次执行附加组件配置步骤。

通用附加解决方案

如果这不是 Gmail 插件,则可以使用基于时间的触发器简单地解决此问题,因为 per documentation:

Add-on triggers will stop firing in any of the following situations:
- If the add-on is uninstalled by the user
- If the add-on is disabled in a document (if it is re-enabled, the trigger will become operational again)
- If the developer unpublishes the add-on or submits a broken version to the add-on store

也就是说,您只需每天将当天的日期写入 PropertiesService#UserProperties 中的键(例如 LAST_SEEN),然后在决定使用哪个键时检查 TOKEN 和 LAST_SEEN要显示的卡片。

<小时/>

Gmail 附加解决方案:

Per Gmail add-on documentation,您无法在 Gmail 插件中创建或使用 Apps 脚本简单/可安装触发器。因此,该解决方案的最简单实现不可用。但是,我们仍然可以使用这种方法,通过移动 LAST_SEEN 键更新的区域。

目前(2018 年 3 月),Gmail 插件唯一可用的触发器是 contextual trigger unconditional:

Currently, the only contextual trigger type available is unconditional, which triggers for all emails regardless of content.

因此,如果您绑定(bind)到此上下文触发器,则在安装附加组件时,每当用户打开电子邮件时,它都会运行一个函数。解决方案是让您的上下文触发函数包含该代码段

PropertiesService.getUserProperties().setProperty("LAST_SEEN", String(new Date().getTime()));

如果您在上下文触发的函数中还有其他事情要做,则该代码将不受此添加的影响。如果您没有上下文触发的函数,那么您需要返回 [](一个空的卡片堆栈)以避免显示任何 UI。

要使用这个新属性,除了您正在使用的 TOKEN 属性之外,您还需要在 buildAddon(e) 方法中查询此值:

var userProps = PropertiesService.getUserProperties().getAll();
var Token = userProps["Token"];
var lastSeen = userProps["LAST_SEEN"] || 0; // If found, will be milliseconds since epoch.
var absence = new Date().getTime() - lastSeen; // Time in ms since last use of add-on.
if (Token == null || absence > /* some duration you choose */ ) {
// New install, or user has started using app again.
return [build_login_card()];
} else {
// User is still using add-on, so do normal stuff.
}
<小时/>
  • 这显然不是一个完美的解决方案(即卸载上下文触发器会更好),但可以帮助检测缺乏使用的情况
  • 写入 PropertiesService 的频率有速率限制。如果您有快速/“高级”用户,他们可能会超出配额。
    • 可以结合 CacheService 和 PropertiesService 来处理“短” session 中的频繁读取(自上次存储到缓存以来最多 6 小时)。

关于google-apps-script - 在 Gmail 插件中处理持久的特定于用户的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com