Javascript 如何让它等待用户输入日期,然后关闭对话框并将值写入目标?
问题是: 我让这些代码毫无错误地运行,但总的来说,它们不会像预期的那样工作 其目的是,一旦用户勾选a列中的一个框,基于onEdit运行的代码将打开一个对话框,供用户输入日期。然后,代码更改行的一列中的一个值,并在该列旁边写入日期。 一旦用户输入日期并单击“添加”,对话框将自动关闭 我不确定函数的顺序以及如何让onEdit函数等待用户输入日期,以便对话框消失并继续将日期写入目标 谢谢你的关注Javascript 如何让它等待用户输入日期,然后关闭对话框并将值写入目标?,javascript,html,jquery,forms,google-apps-script,Javascript,Html,Jquery,Forms,Google Apps Script,问题是: 我让这些代码毫无错误地运行,但总的来说,它们不会像预期的那样工作 其目的是,一旦用户勾选a列中的一个框,基于onEdit运行的代码将打开一个对话框,供用户输入日期。然后,代码更改行的一列中的一个值,并在该列旁边写入日期。 一旦用户输入日期并单击“添加”,对话框将自动关闭 我不确定函数的顺序以及如何让onEdit函数等待用户输入日期,以便对话框消失并继续将日期写入目标 谢谢你的关注 function onEdit() { var ss = SpreadsheetApp.getActi
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
,我使用了PropertiesServiceAddRecord
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
函数名用作可安装触发器时,函数将运行2次。也请注意这一点onEdit
- 在这个修改后的脚本中,它假定在脚本中创建的
是您期望的正确值。请小心这个dbRow
google.script.run.AddRecord(orderdate);
google.script.run.withSuccessHandler(google.script.host.close).AddRecord(orderdate);