等待一个函数完成后再开始下一个函数

时间:2021-01-09 22:50:06

标签: google-apps-script promise async-await return wait

我是个菜鸟,所以“我的”代码可能不是它应该的样子。我使用这个 (https://blog.gsmart.in/google-apps-script-send-email-with-attachment/) 作为灵感并对其进行了一些修改。

让我先解释一下我想要实现的目标。我有很多不同人的联系信息,我希望他们能够检查这些信息是否仍然准确。我找到了一个解决方案,在该解决方案中,我首先将“所有人”提取到单独的 Google 表格中(遵循以下准则:https://www.youtube.com/watch?v=eVGENHcrOc4)。然后我给每个人发了一封电子邮件,只附上他们的信息,上面提到的代码,我稍微修改了一下。

它有效(我运行函数“sendFormToAll()”)。

但是。自动创建的表格的列太窄:信息不可读。所以我又摆弄了一些,并在某处添加了“autoResizeColumns”。我花了一些时间才把它弄好,但现在它起作用了。

但仍然...当运行“sendFormToAll()”时,autoResizeColumns 函数在 sendEmailWithAttachment 函数启动之前没有完成任务,所以发送出去的 pdf 文件仍然不好。如果我稍后再次运行代码,pdf 文件是好的,因为到那时,所有工作表都已调整大小。

所以我正在寻找一种运行“sendFormToAll()”的方法,其中系统首先让 autoResizeColumns 做他的事情,然后才从 sendEmailWithAttachment 开始。我尝试阅读 async/await,但我无法弄清楚...与 Promise 和 .then 的处理相同...我尝试实现它,但没有效果。

感谢您的帮助!

这是我现在得到的代码(包括无用的 async/await 实现):

function sendEmailWithAttachment(row)
{
   var sheet = SpreadsheetApp.getActive().getActiveSheet();
   
   var values = sheet.getRange(row,1,row,4).getValues();
   var rec = values[0];
  
  var filename = rec[0]
    
  var file = DriveApp.getFilesByName(filename);
  
  if (!file.hasNext()) 
  {
    console.error("Could not open file "+filename);
    return;
  }

  var client = getClientInfo(row);
  
  var template = HtmlService
      .createTemplateFromFile('email-template');
  template.client = client;
  var message = template.evaluate().getContent();
  
  
  MailApp.sendEmail({
    to: client.email,
    subject: "The form to fill",
    htmlBody: message,
    attachments: [file.next().getAs(MimeType.PDF)]
  });
}

function getClientInfo(row)
{
   var sheet = SpreadsheetApp.getActive().getActiveSheet();
   
   var values = sheet.getRange(row,1,row,5).getValues();
   var rec = values[0];
  
  var client = 
      {
        first_name: rec[1],
        last_name: rec[2],
        email: rec[4]
      };
  client.name = client.first_name+' '+client.last_name;
  return client;
}

function correctColumns(row)
{
   var sheet = SpreadsheetApp.getActive().getActiveSheet();
   
   var values = sheet.getRange(row,1,row,4).getValues();
   var rec = values[0];
  
  var filename = rec[0]
    
  var file = DriveApp.getFilesByName(filename);
  
  if (!file.hasNext()) 
  {
    console.error("Could not open file "+filename);
    return;
  }

  while (file.hasNext()) {
    var spreadsheet = SpreadsheetApp.open(file.next());
    var sheet = spreadsheet.getSheets()[0];
    sheet.autoResizeColumns(1, 15);
  }
}

async function sendFormToAll()
{
   var sheet = SpreadsheetApp.getActive().getActiveSheet();
  
   var last_row = sheet.getDataRange().getLastRow();
  
   var last_column = sheet.getLastColumn()

   for(var row=2; row <= last_row; row++)
   {
     await correctColumns(row);
     sendEmailWithAttachment(row);
     sheet.getRange(row,last_column).setValue("email sent");
   }
}

0 个答案:

没有答案
相关问题