google.script.run.withSuccessHandler() returns Undefined

cod*_*ard 3 web-applications google-sheets google-apps-script

I created an array in a separate GS file using the code provided below. I tried calling it in my HTML file. My goal is to compare the contents the array to the parameter email. However, the value returned by 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;
}
Run Code Online (Sandbox Code Playgroud)
//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");
    }
Run Code Online (Sandbox Code Playgroud)

The*_*ter 5

问题:

  • 使用异步函数的( google.script.run) 返回值,它总是undefined.

解决方案:

  • 使用另一个答案中提到的successHandler,或者我们可以将promise 与async/await 一起使用。

片段:

/*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);
      //....
    }
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 最好减少对服务器的调用次数。如果你能将两者结合Getter成一个单一的服务器功能,那就更好了。
  • 上面是一个片段,展示了如何使用async/ await。但是,如果您等待来自服务器的每个响应,如上所示,您的前端/UI 将会很慢。仅在绝对必要时才等待。对服务器的调用应该是非阻塞/异步的。

参考: