我使用下面提供的代码在单独的 GS 文件中创建了一个数组。我尝试在 HTML 文件中调用它。我的目标是将数组的内容与参数进行比较email
。但是,返回的值google.script.run.withSuccessHandler()
is undefined
//in GS
function mailGetter()
{
//open sheet
var sheet = SpreadsheetApp.openByUrl("https://sheet.url").getSheetByName("Email Sheet").activate();
//get size of given row range
var row_data_email = sheet.getRange("C2:C").getValues();
var emailArray = row_data_email.join().split(',').filter(Boolean);
Logger.log(emailArray);
return emailArray;
}
//in HTML
function checkEmail(email)
{
var reg1 = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
var arraySize = google.script.run.withSuccessHandler(misc).sizeGetter();
console.log(arraySize);
var emailArray = new Array(arraySize);
emailArray = google.script.run.withSuccessHandler(misc).mailGetter();
console.log(emailArray);
if (reg1.test(email) == false)
{
emails.style.border = "1px solid red";
document.getElementById('submitBtn').disabled = true;
}
else if (reg1.test(email) == true)
{
emails.style.border = "1px solid green";
document.getElementById('submitBtn').disabled = false;
}
for (var row = 0; row < arraySize; row++)
{
if (emailArray[row][0] == email)
{
emails.style.border = "1px solid green";
document.getElementById('submitBtn').disabled = false;
break;
}
else if (emailArray[row][0] != email)
{
emails.style.border = "1px solid red";
document.getElementById('submitBtn').disabled = true;
}
}
}
function misc()
{
console.log("Pass");
}
Issue:
- 使用异步函数的(
google.script.run
) 返回值,该值始终是undefined
.
解决方案:
- 使用另一个答案中提到的 successHandler 或我们可以将 Promise 与 async/await 一起使用。
Snippet:
/*Create a promise around old callback api*/
const p = func =>
new Promise(resolve=>
google.script.run.withSuccessHandler(resolve)[func]()
);
async function checkEmail(email) //modified
{
var arraySize = await p('sizeGetter');//Wait to resolve
console.log(arraySize);
//var emailArray = new Array(arraySize);
var emailArray = await p('mailGetter');//Wait to resolve
console.log(emailArray);
//....
}
Note:
- 最好减少对服务器的调用次数。如果你能将两者结合起来
Getter
如果是单一服务器功能,那就更好了。
- 上面是一个片段,展示了如何使用
async
/await
。但是,如果您等待服务器的每个响应(如上所示),您的前端/UI 将会很慢。仅在绝对必要时等待。对服务器的调用应该是非阻塞/异步的。
参考:
- Promises https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Creating_a_Promise_around_an_old_callback_API
- async https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
- await https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)