Javascript 管理过滤ID Gmail

Javascript 管理过滤ID Gmail,javascript,google-apps-script,filter,gmail,Javascript,Google Apps Script,Filter,Gmail,我正在尝试为组中每个人的电子邮件创建一个过滤器。然而,有时一个人的电子邮件可能会更改,如添加新电子邮件或更改为另一封电子邮件。这意味着我必须相应地更新过滤器。我试图创建一个ID为且姓名为的筛选器。所以我可以检索该过滤器来修改它。然而,Gmail过滤器的ID似乎是自动创建的 var filter = Gmail.newFilter() var email = 'something@some.com' filter.id = 'person' filter.criteria = Gmail.newF

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

这将返回
notfound
错误,即使我可以在Gmail中看到过滤器的设置。我在上面创建的过滤器的实际ID是
ANe1Bmgel8OKlEXD-uArX77ISk35Lph1MbWWjA


我的问题是,管理器通过更改过滤并保持更新的好方法是什么?

根据API文档:

id:string服务器分配的筛选器id

因此,您无法分配ID,并且在调用
.create
时为其设置的任何值都将被忽略

您仍然可以使用和
数组#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});
}
而不是:

Gmail.Users.Settings.Filters.create(filter, 'me');
尝试:


根据API文档

如果成功,此方法将返回响应正文中的Users.settings.filters资源

上面的代码在类似的情况下对我有效。要在Gmail之外跟踪filterId,您可以通过财产服务将此人的姓名与id绑定:

PropertiesService.getScriptProperties().setProperty(nameVar, filterId);
然后像这样检索它:

PropertiesService.getScriptProperties().getProperty(nameVar);

为什么不使用
create
请求的回复呢?为了澄清我的评论,如果你立即
。创建一个过滤器,然后在一个单独的
。get
中查询它,你经常会收到“not found”错误,因为你正在与谷歌竞争——谷歌必须将该过滤器的存在传播到各个服务器端点。但是,如果将调用的回复绑定到
.create
,则会在API响应中获得新的筛选器信息:
var created=Gmail.Users.Settings.Filters.create(…)并可以根据需要存储创建的ID。您的问题中不清楚您是如何测试
.get
调用的,因此请澄清您的情况。我测试了
.get
调用,在我手动查看设置(通过在web浏览器中单击)时确认过滤器已存在之后。我通过所有过滤器检索到的id,并获得该过滤器中的所有信息,我可以毫无疑问地说,这是我通过脚本创建的过滤器。此外,没有我通过脚本设置的ID为
person
的过滤器。我非常感谢您提供的信息。但我不认为记住过滤器的确切标准是管理它的好方法。除了使用过滤器的某些部分,没有其他方法可以识别过滤器。除了
标准
,还有其他过滤器属性,但您仍需要了解其中的某些部分。考虑到您的使用案例(电子邮件的更改),您当然可以查询与旧电子邮件匹配的筛选器,并修改它们以使用新的。我并不认为这是管理筛选器的好方法。然而,这似乎是最好的方法(就可用功能而言)。因此,如果一周内没有其他人说任何话,我会将此标记为一个答案。
PropertiesService.getScriptProperties().getProperty(nameVar);