Folders.hasNext()从Google表格中返回false,但直接从Google Script调用时为true

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Folders.hasNext()从Google表格中返回false,但直接从Google Script调用时为true相关的知识,希望对你有一定的参考价值。

概观

我正在为我的谷歌表制作一个脚本。

我有一个帮助方法,它接收电子邮件参数(字符串),然后邀请该电子邮件到谷歌驱动器文件夹。

我还有edit()函数,只要Google表格中的字段发生变化,就会调用该函数。


问题:

当自己从Google Scripts调用helper方法时,它工作正常,我收到了邀请。当在google工作表中使用edit()触发辅助方法时,它不会一直发送邀请。它返回while函数返回false:

 var newFolder = DriveApp.getFoldersByName("New Folder");
  Logger.log(newFolder.hasNext());
  while(newFolder.hasNext()) {      -> returns false while in google sheets
    var folder = newFolder.next();
    Logger.log("folder -> " + folder);  
    folder.addViewer(newPersonEmail);
  } 

我尝试了什么:

Logger.log显示newFolder.hasNext()返回false而脚本从edit()函数调用(当我在谷歌表中进行更改时)。但是当我在Google脚本中调试函数时它会返回true。

答案

您必须为特定用户注册edit()。简单的onEdit触发器是不可能的。

它返回false,因为当前用户没有任何内容。这是真的。

=====更新=====

至于我,我认为每当我们需要他们的范围时,为用户创建触发器是正常的。假设我们需要强制用户注册触发器。他必须运行regTrigger()

/**
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
function edit(e) {
  // there is the edit eveng action
}

/**
 * Register trigger
 * @returns {GoogleAppsScript.Script.Trigger}
 */
function regTrigger() {
  var activeSpreadsheet = SpreadsheetApp.getActive();
  var triggers = ScriptApp.getUserTriggers(activeSpreadsheet).filter(function(
    trigger
  ) {
    return (
      trigger.getEventType() === ScriptApp.EventType.ON_EDIT &&
      trigger.getHandlerFunction() === 'edit'
    );
  });

  if (triggers.length) return triggers[0];

  return ScriptApp.newTrigger('edit')
    .forSpreadsheet(activeSpreadsheet)
    .onEdit()
    .create();
}

现在你的任务是让用户有机会执行一次这个功能(regTrigger)。例如,从菜单中。或者在打开表格强制执行某些事件时实现。

以上是关于Folders.hasNext()从Google表格中返回false,但直接从Google Script调用时为true的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Datalab,如何在 Google BigQuery 中使用 UDF 从复杂查询创建表?

由于数据类型,无法查询从 Google 表格加载的 BigQuery 表

Google BigQuery:仅从最新表中选择

如何设置表的架构以在 Google App Scripts 中自动检测从 Google Cloud Storage 获取数据?

从 Google 工作表过滤器添加的新行上的另一个邮件合并触发器

从Google驱动器导入文件到bigquery时如何指定工作表