我正在尝试为组中每个人的电子邮件创建过滤器。但是,有时一个人的电子邮件可能会更改,例如添加新电子邮件或更改为另一封电子邮件。这意味着我必须相应地更新过滤器。我尝试创建ID为该人姓名的过滤器。因此,我可以检索该过滤器以对其进行修改。但是,似乎Gmail过滤器的ID是自动创建的。
var filter = Gmail.newFilter()
var email = 'something@some.com'
filter.id = 'person'
filter.criteria = Gmail.newFilterCriteria()
filter.criteria.query = email
filter.action = Gmail.newFilterAction()
filter.action.addLabelIds = ['Label_1']
Gmail.Users.Settings.Filters.create(filter, 'me')
当我取回过滤器时,它会说找不到它
var filter2 = Gmail.Users.Settings.Filters.get('me', 'person')
这将返回Not Found
错误,即使我可以在Gmail中看到设置中的过滤器。我在上面创建的过滤器的实际ID为ANe1Bmgel8OKlEXD-uArX77ISk35Lph1MbWWjA
。
我的问题是,经理通过变更进行过滤,保持更新的最佳方法是什么?
答案 0 :(得分:1)
代替:
Gmail.Users.Settings.Filters.create(filter, 'me');
尝试:
var filterProps = Gmail.Users.Settings.Filters.create(filter, 'me');
var filterId = filterProps.id;
根据creating a filter的API文档,
如果成功,此方法将在响应正文中返回Users.settings.filters资源。
上面的代码在类似的情况下对我有用。要跟踪Gmail外部的filterId,您可以通过属性服务将该人的姓名与ID关联起来:
PropertiesService.getScriptProperties().setProperty(nameVar, filterID);
然后像这样检索它:
PropertiesService.getScriptProperties().getProperty(nameVar);
答案 1 :(得分:0)
根据Filter
resource的API文档:
id: string 服务器分配的过滤器ID。
因此,您无法分配ID,并且在调用.create
时为其设置的任何值都将被忽略。
例如,您仍然可以使用.list
和Array#filter
以编程方式检索此过滤器
function getAllFilters_(userId) {
const options = {};
const filters = [];
do {
var search = Gmail.Users.Settings.Filters.list(userId, options);
if (search.filter && search.filter.length) {
Array.prototype.push.apply(filters, search.filter);
options.pageToken = search.nextPageToken;
} while (options.pageToken);
return filters;
}
function getFiltersWithCriteria_(filterList, criteria) {
// `criteria` is an object of parameters that must be exactly matched in the filters' criteria property
const props = Object.keys(criteria);
const matches = filterList.filter(function (gFilter) {
// gFilter is a https://developers.google.com/gmail/api/v1/reference/users/settings/filters#resource
var fCriteria = gFilter.criteria;
return props.every(function (prop) {
return criteria[prop] === fCriteria[prop];
});
});
return matches;
}
function foo() {
const filters = getAllFilters_("me");
const matched = getFiltersWithCriteria_(filters, {
from: "george@example.com",
hasAttachment: true
});
console.log({message: "Matching filters", matches: matched});
}