管理过滤器ID Gmail

时间:2018-10-13 05:04:04

标签: javascript google-apps-script filter gmail

我正在尝试为组中每个人的电子邮件创建过滤器。但是,有时一个人的电子邮件可能会更改,例如添加新电子邮件或更改为另一封电子邮件。这意味着我必须相应地更新过滤器。我尝试创建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

我的问题是,经理通过变更进行过滤,保持更新的最佳方法是什么?

2 个答案:

答案 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时为其设置的任何值都将被忽略。

例如,您仍然可以使用.listArray#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});
}