只有 else 条件在我的 google 应用程序脚本 Twilio 传真发送网络应用程序中有效

Only the else condition works in my google apps script Twilio Fax sending web app

我的 If 语句有问题。

基本上我使用 Twilio 和 Google 应用程序脚本设置了一个传真应用程序。

我让用户选择上传文档或发送存储在我的 Google 驱动器上的文档。 如果我上传一个文件,它就可以工作。但是,如果我选中复选框以发送预设文档,我试图通过使用 If 语句来完成它不会发送。

我进行了故障排除,发现 If 语句得到的是 TRUE 和 FALSE 值。

我认为问题是当没有文件传递给函数时它不起作用。问题是我通过 If 语句避开了文件,所以为什么它不起作用。

下面是我的 HTML 文件和服务器端应用脚本。

有什么建议吗?

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('form.html');

}

function uploadFiles(blob, name, number, test) {
 
       //get destination number
  var num = number;
  var prefix = "+1";
  var removeDashes = num.replace(/-/g,"");
  var fullNumber = prefix + removeDashes;
  
  var output;
if (test){
output = "APPLICATION SENT!";
}else{
output = "FAX SENT!";
}
  
    var url;
  if (test) {
  var appl = DriveApp.getFileById('xxxxxxxxx');
  var appurl = appl.getDownloadUrl();
    url = appurl;  

  } else {
    var folder = DriveApp.getFolderById('xxxxxxxxxxx');
    var blob = blob.split(",");
    var blob = Utilities.newBlob(Utilities.base64Decode(blob[1]), 'application/pdf');
    var fileName = blob.setName(name).getName();
    var file = folder.createFile(blob); 
  
      //allow access to Twilio
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
  
  //get file url
  var id = file.getId();
  var getfile = DriveApp.getFileById(id);
  var getnewurl = getfile.getDownloadUrl();
   var url = getnewurl;
 }
  
   //send fax
  var faxUrl = "https://fax.twilio.com/v1/Faxes";
         
        var payload = {
          "From" : "+1888888888",
          "To": fullNumber,
          "MediaUrl" : url,
          "Method" : "POST",
        };
        
        var options = {
          "method" : "post",
          "payload" : payload
        };
        
        options.headers = {    
          "Authorization" : "Basic " + Utilities.base64Encode("ACxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxx")
        };
        UrlFetchApp.fetch(faxUrl, options);
  
  return "succes" + output;
}

这是 HTML 文件:(为了缩短我删除了 <style>

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);

function upload() {
var file = document.getElementsByName('myFile')[0].files[0];
var number = document.getElementsByName('Pnumber')[0].value;
var test = document.getElementsByName("entered")[0].checked;
var reader = new FileReader();
reader.onload = function (e) {
var content = reader.result;

google.script.run.withSuccessHandler(fileUploaded).uploadFiles(content, file.name, number, test);

return false;
}
reader.readAsDataURL(file);
}   

function fileUploaded(status) {
document.getElementById("myForm").reset();
document.getElementById('output').innerHTML = status;
}    
</script>
</head>
<body>
<div align="center">
<h1 align="center" style="color:darkblue">FAX APP</h1>

<h2 align="center">SEND OUTGOING FAX</h2>
<hr>
<form id="myForm" align="center">

<label for="pdf">Choose a PDF file to upload -- <b>OR</b>-- Check "SEND APPLICATION" </label>
<br>
<input id="pdf" type="file" name="myFile" >
<br><br>

<input type="checkbox" style="width:25px ; height:25px" name="entered">
<label for="entered" style="font-size:30px" >  SEND APPLICATION</label>

<br><br>
<label for="phonenumber">Enter Destination Number</label>
<br>
<input id="phonenumber" type="text" name="Pnumber" placeholder="Phone Number" >
<br>
<input type="submit" value="SEND FAX" onclick="upload()" >
</form>
<p><b>FAX DELIVERY STATUS:</b></p>
<div id="output"align="center"><b></b></div>
<br>
<a href="https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxxx?usp=sharing"
target="_blank">SENT FAX DOCUMENTS</a>
</div>

</body>
</html>

下面是 GOOGLE 脚本端和 HTML 现在可以工作的代码 感谢@Tanaike 的帮助

当前 GOOGLE 脚本端代码:

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('form.html');

}

function uploadFiles(blob, name, number, test) {
 
       //get destination number
  var num = number;
  var prefix = "+1";
  var removeDashes = num.replace(/-/g,"");
  var fullNumber = prefix + removeDashes;
  
  var output;
if (test){
output = "APPLICATION SENT!";
}else{
output = "FAX SENT!";
}
  
  var url;
if (test) {
  var appl = DriveApp.getFileById('xxxxxxxxxxxxxxxxxxxxxxx');
  var appurl = appl.getDownloadUrl();
    url = appurl;  
  } else {
    var folder = DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxxxxx');

    var blob = blob.split(",");
    var blob = Utilities.newBlob(Utilities.base64Decode(blob[1]), 'application/pdf', name);
    
    var file = folder.createFile(blob); 
  
      //allow access to Twilio
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
  
  //get file url
  var id = file.getId();
  var getfile = DriveApp.getFileById(id);
  var getnewurl = getfile.getDownloadUrl();
   url = getnewurl;
 }
  
    
   
   //send fax
  var faxUrl = "https://fax.twilio.com/v1/Faxes";
         
        var payload = {
          "From" : "+188888888888",
          "To": fullNumber,
          "MediaUrl" : url,
          "Method" : "POST",
        };
        
        var options = {
          "method" : "post",
          "payload" : payload
        };
        
        options.headers = {    
          "Authorization" : "Basic " + Utilities.base64Encode("ACxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxx")
        };
        UrlFetchApp.fetch(faxUrl, options);
  
  return "Success - " + output;
}

当前 HTML 副代码:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">

    <script>
      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);

function upload() {
  var file = document.getElementsByName('myFile')[0].files[0];
  var number = document.getElementsByName('Pnumber')[0].value;
  var test = document.getElementsByName("entered")[0].checked;
  
        if(!test){
            var reader = new FileReader();
          reader.onload = function (e) {
            var content = reader.result;
        
        google.script.run.withSuccessHandler(fileUploaded).uploadFiles(content, file.name, number, null);
        
        return false;
        }
        
        reader.readAsDataURL(file);  
        
        }else{
        google.script.run.withSuccessHandler(fileUploaded).uploadFiles(null, null, number, test);
        
        return false;
        }
}
function fileUploaded(status) {
document.getElementById("myForm").reset();
document.getElementById('output').innerHTML = status; 
}
</script>
</head>






<body>
<div align="center">
<h1 align="center" style="color:darkblue">FAX APP</h1>

<h2 align="center">SEND OUTGOING FAX</h2>
<hr>
<form id="myForm" align="center">

<label for="pdf">Choose a PDF file to upload -- <b>OR</b>-- Check "SEND APPLICATION" </label>
<br>
<input id="pdf" type="file" name="myFile" >
<br><br>

<input type="checkbox" style="width:25px ; height:25px" name="entered">
<label for="entered" style="font-size:30px" >  SEND APPLICATION</label>

<br><br>
<label for="phonenumber">Enter Destination Number</label>
<br>
<input id="phonenumber" type="text" name="Pnumber" placeholder="Phone Number" >
<br>
<input type="submit" value="SEND FAX" onclick="upload()" >
</form>
<p><b>FAX DELIVERY STATUS:</b></p>
<div id="output"align="center"><b></b></div>
<br>
<a href="https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxx?usp=sharing"
target="_blank">SENT FAX DOCUMENTS</a>
</div>

</body>
</html>

我相信你的目标如下。

  • 您想在未选择文件的情况下检查 SEND APPLICATION 时删除错误。

修改点:

  • 未选择文件时,FileReader处出错,因为file未定义。我认为这可能是您遇到问题的原因。
  • 在这种情况下,我想在 Javascript 端提出功能 upload() 如下。
      使用
    • if (file && !test) {}else{}。这样,
      • 当文件被选中且 SEND APPLICATION 未选中时,将使用所选文件。
      • 未选择文件或勾选SEND APPLICATION时,使用var appl = DriveApp.getFileById('xxxxxxxxx')的文件。
    • 关于这个,请根据自己的实际情况修改if语句。

修改后的脚本:

当您的脚本修改时,请在Javascript端修改upload()如下。

function upload() {
  var file = document.getElementsByName('myFile')[0].files[0];
  var number = document.getElementsByName('Pnumber')[0].value;
  var test = document.getElementsByName("entered")[0].checked;
  
  // I modified below script.
  if (file && !test) {
    var reader = new FileReader();
    reader.onload = function(e) {
      var content = reader.result;
      google.script.run.withSuccessHandler(fileUploaded).uploadFiles(content, file.name, number, test);
      return false;
    }
    reader.readAsDataURL(file);
  } else {
    google.script.run.withSuccessHandler(fileUploaded).uploadFiles(null, null, number, test);
  }
}
  • 本次修改,Google Apps Script端未修改。

已添加:

我认为您当前的问题是由于您从初始问题中的脚本更改了 Google Apps 脚本。在当前脚本中,name 在 Google Apps 脚本和 Javascript 处被删除。由此,在createFile处发生错误。请使用name如下。

发件人:

var blob = Utilities.newBlob(Utilities.base64Decode(blob[1]), 'application/pdf');

收件人:

var blob = Utilities.newBlob(Utilities.base64Decode(blob[1]), 'application/pdf', "sample");
  • 在这种情况下,文件名是临时的。所以你可以使用各种名称,如“sample”、“temp”等。

  • 并且当您修改了 Web Apps 的脚本时,请重新部署 Web Apps 作为新版本。由此,最新的脚本被反​​映到Web Apps。请注意这一点。

  • 并且在您当前的脚本中,使用了 if (!test) {。在这种情况下,当单击按钮而不选择文件并选中复选框时,会发生错误。请注意这一点。