Javascript 如何让它等待用户输入日期,然后关闭对话框并将值写入目标?

Javascript 如何让它等待用户输入日期,然后关闭对话框并将值写入目标?,javascript,html,jquery,forms,google-apps-script,Javascript,Html,Jquery,Forms,Google Apps Script,问题是: 我让这些代码毫无错误地运行,但总的来说,它们不会像预期的那样工作 其目的是,一旦用户勾选a列中的一个框,基于onEdit运行的代码将打开一个对话框,供用户输入日期。然后,代码更改行的一列中的一个值,并在该列旁边写入日期。 一旦用户输入日期并单击“添加”,对话框将自动关闭 我不确定函数的顺序以及如何让onEdit函数等待用户输入日期,以便对话框消失并继续将日期写入目标 谢谢你的关注 function onEdit() { var ss = SpreadsheetApp.getActi

问题是:

我让这些代码毫无错误地运行,但总的来说,它们不会像预期的那样工作

其目的是,一旦用户勾选a列中的一个框,基于onEdit运行的代码将打开一个对话框,供用户输入日期。然后,代码更改行的一列中的一个值,并在该列旁边写入日期。 一旦用户输入日期并单击“添加”,对话框将自动关闭

我不确定函数的顺序以及如何让onEdit函数等待用户输入日期,以便对话框消失并继续将日期写入目标

谢谢你的关注

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DB');
  var dbData = sheet.getRange(2, 1, sheet.getLastRow(), 39).getValues();
  var ItemNumberSheet = ss.getSheetByName("To ORDER");
  var ItemNoRow = ItemNumberSheet.getActiveCell().getRow();//Getting row from active cell
  var ItemNoCol = 4;
  var ItemNo = ItemNumberSheet.getRange(ItemNoRow, ItemNoCol).getValue();
  var orderTicked = ItemNumberSheet.getRange(ItemNoRow, 1).getValue();
  var dbRow = 1;

  if (ss.getActiveSheet().getName() == 'To ORDER' && 
  ItemNumberSheet.getRange(ItemNoRow, 1).getValue() == true && ItemNoRow > 6 && ItemNo != '') {
    for (var a = 0; a < dbData.length; a++) {
      var row = dbData[a];
      if (dbData[a][0] != '') {
        if (orderTicked == true && dbData[a][2] == ItemNo) {
          dbRow = a + 1;
          break;
        }
      }
    }
    showDatePicker(); //This is calling the dialog box
    sheet.getRange(dbRow + 1, 31).setValue(AddRecord());//This is supposed to write the date to the destination
    sheet.getRange(dbRow + 1, 32).setValue("Yes");
    sheet.getRange(dbRow + 1, 38).setValue(new Date());
    sheet.getRange(dbRow + 1, 39).setValue(Session.getEffectiveUser().getEmail());
    SpreadsheetApp.flush();
    ItemNumberSheet.getRange(ItemNoRow, 1).setValue("false");
  }
}
现在是html+脚本:

<!--https://developers.google.com/speed/libraries-->
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">   
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <script>
    $( document ).ready(function() {
      $("#orderdate").datepicker();
    });
    function AddRecord(){
      var orderdate = document.getElementById("orderdate").value;
      google.script.run.AddRecord(orderdate);
      document.getElementById("orderdate").value = '';
    }
    </script>
  </head>
  <body>
    Order Date:<input type="text" id="orderdate" /> 
    <input type="button" value="Add" onclick="AddRecord()" />
  </body>
</html>

$(文档).ready(函数(){
$(“#orderdate”).datepicker();
});
函数AddRecord(){
var orderdate=document.getElementById(“orderdate”).value;
google.script.run.AddRecord(orderdate);
document.getElementById(“orderdate”)。值=“”;
}
订购日期:
修改点:
  • 运行
    showModalDialog
    时,进程将从当前函数中释放。我想这可能是你问题的原因
  • 而且,当我看到您的脚本时,我认为
    AddRecord()
    “Yes”
    newdate()
    Session.getEffectiveUser().getEmail()
    设置值一起放置
  • 在这种情况下,可以使用
    uncheck()
  • 为了通过Javascript执行
    dbRow
    onEdit
    发送到
    AddRecord
    ,我使用了PropertiesService
当上述各点反映到脚本中时,它将变成如下所示

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DB');
  var dbData = sheet.getRange(2, 1, sheet.getLastRow(), 39).getValues();
  var ItemNumberSheet = ss.getSheetByName("To ORDER");
  var ItemNoRow = ItemNumberSheet.getActiveCell().getRow();//Getting row from active cell
  var ItemNoCol = 4;
  var ItemNo = ItemNumberSheet.getRange(ItemNoRow, ItemNoCol).getValue();
  var orderTicked = ItemNumberSheet.getRange(ItemNoRow, 1).getValue();
  var dbRow = 1;
  if (ss.getActiveSheet().getName() == 'To ORDER' &&
    ItemNumberSheet.getRange(ItemNoRow, 1).getValue() == true && ItemNoRow > 6 && ItemNo != '') {
    for (var a = 0; a < dbData.length; a++) {
      var row = dbData[a];
      if (dbData[a][0] != '') {
        if (orderTicked == true && dbData[a][2] == ItemNo) {
          dbRow = a + 1;
          break;
        }
      }
    }
    PropertiesService.getScriptProperties().setProperty("key", dbRow);
    showDatePicker();
  }
}

function AddRecord(orderdate) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DB');
  var ItemNumberSheet = ss.getSheetByName("To ORDER");
  var ItemNoRow = ItemNumberSheet.getActiveCell().getRow();
  var v = PropertiesService.getScriptProperties().getProperty("key");
  var dbRow = v ? Number(v) : 1;
  sheet.getRange(dbRow + 1, 31, 1, 2).setValues([[orderdate, "Yes"]]);
  sheet.getRange(dbRow + 1, 38, 1, 2).setValues([[new Date(), Session.getEffectiveUser().getEmail()]]);
  ItemNumberSheet.getRange(ItemNoRow, 1).uncheck();
}
修改脚本: 谷歌应用程序脚本端: 请修改
onEdit
AddRecord
,如下所示

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DB');
  var dbData = sheet.getRange(2, 1, sheet.getLastRow(), 39).getValues();
  var ItemNumberSheet = ss.getSheetByName("To ORDER");
  var ItemNoRow = ItemNumberSheet.getActiveCell().getRow();//Getting row from active cell
  var ItemNoCol = 4;
  var ItemNo = ItemNumberSheet.getRange(ItemNoRow, ItemNoCol).getValue();
  var orderTicked = ItemNumberSheet.getRange(ItemNoRow, 1).getValue();
  var dbRow = 1;
  if (ss.getActiveSheet().getName() == 'To ORDER' &&
    ItemNumberSheet.getRange(ItemNoRow, 1).getValue() == true && ItemNoRow > 6 && ItemNo != '') {
    for (var a = 0; a < dbData.length; a++) {
      var row = dbData[a];
      if (dbData[a][0] != '') {
        if (orderTicked == true && dbData[a][2] == ItemNo) {
          dbRow = a + 1;
          break;
        }
      }
    }
    PropertiesService.getScriptProperties().setProperty("key", dbRow);
    showDatePicker();
  }
}

function AddRecord(orderdate) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DB');
  var ItemNumberSheet = ss.getSheetByName("To ORDER");
  var ItemNoRow = ItemNumberSheet.getActiveCell().getRow();
  var v = PropertiesService.getScriptProperties().getProperty("key");
  var dbRow = v ? Number(v) : 1;
  sheet.getRange(dbRow + 1, 31, 1, 2).setValues([[orderdate, "Yes"]]);
  sheet.getRange(dbRow + 1, 38, 1, 2).setValues([[new Date(), Session.getEffectiveUser().getEmail()]]);
  ItemNumberSheet.getRange(ItemNoRow, 1).uncheck();
}
致:
  • 通过此修改,单击按钮时,可以关闭对话框
注:
  • 从您的问题中,我无法理解执行
    onEdit
    函数的方法。使用
    onEdit
    作为简单触发器时,会发生错误,因为简单触发器无法运行
    SpreadsheetApp.getUi().showmodaldialdialog()
    。请小心这个。而且,当您可能将
    onEdit
    与可安装的onEdit触发器一起使用时,请将函数名从
    onEdit
    重命名为其他名称,然后重新安装。因为当
    onEdit
    函数名用作可安装触发器时,函数将运行2次。也请注意这一点
  • 在这个修改后的脚本中,它假定在脚本中创建的
    dbRow
    是您期望的正确值。请小心这个
参考资料:

难以置信!非常感谢。“现在,是时候让我开始了解这些参考资料了。”安东尼奥·桑托斯谢谢你的回复。我很高兴你的问题解决了。也谢谢你。
google.script.run.AddRecord(orderdate);
google.script.run.withSuccessHandler(google.script.host.close).AddRecord(orderdate);