Folders.hasNext() 从 Google 工作表返回 false,但从 Google 脚本直接调用时返回 true
Folders.hasNext() returning false from Google Sheets but true when called directly from Google Script
概览
我正在为我的 google sheet.
制作脚本
我有一个辅助方法,它将电子邮件作为参数(字符串),然后将该电子邮件邀请到 google 驱动器文件夹。
我还有 edit() 函数,只要 Google 表格中的字段发生更改,该函数就会被调用。
问题:
当从 Google 脚本中自行调用辅助方法时,它工作正常并且我收到了邀请。
当我在 google sheets 时从 edit() 触发辅助方法时,它不会一直发送邀请。它在 returns false:
的 while 函数处停止
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()
returns false 而脚本
从 edit()
函数调用(当我在 google 中进行更改时
sheets)。但是当我简单地调试 Google 中的函数时它 returns 是真的
脚本。
您必须为特定用户注册 edit()
。简单的 onEdit
触发器是不可能的。
它returns 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
)。例如,从菜单。或者在您打开 Table 强制某些事件时让它发生。
概览
我正在为我的 google sheet.
制作脚本我有一个辅助方法,它将电子邮件作为参数(字符串),然后将该电子邮件邀请到 google 驱动器文件夹。
我还有 edit() 函数,只要 Google 表格中的字段发生更改,该函数就会被调用。
问题:
当从 Google 脚本中自行调用辅助方法时,它工作正常并且我收到了邀请。 当我在 google sheets 时从 edit() 触发辅助方法时,它不会一直发送邀请。它在 returns false:
的 while 函数处停止 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()
returns false 而脚本
从 edit()
函数调用(当我在 google 中进行更改时
sheets)。但是当我简单地调试 Google 中的函数时它 returns 是真的
脚本。
您必须为特定用户注册 edit()
。简单的 onEdit
触发器是不可能的。
它returns 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
)。例如,从菜单。或者在您打开 Table 强制某些事件时让它发生。