【发布时间】:2021-03-04 11:41:49
【问题描述】:
首先抱歉,如果这是一个愚蠢的问题,因为我是编码和编程的新手。
我正在尝试使用 Google Apps 脚本为我的公司创建一个 CRM Webapp,它将所有数据存储在 Google Sheet 中。工作仍在进行中。
这个 CRM Web 应用程序基本上有一个主页选项卡(用于搜索和编辑数据)、销售选项卡(用于输入销售条目)、购买选项卡(用于输入购买条目)和联系选项卡(用于添加联系方式)。
这个想法是,用户将首先在“联系”选项卡中添加新客户/供应商的联系方式,这些数据将存储在 Google 表格中。
现在要进行销售或购买条目,用户现在必须首先在相应的选项卡中选择已输入的联系人(仅显示姓名、电话号码和电子邮件 ID)。
为此,我正在尝试从 Bootstrap 添加一个数据列表,这将帮助用户搜索和选择已存储的联系人详细信息,并且需要根据所选姓名/电子邮件/电话自动填写相关的联系人字段。
我厌倦了很多方法并参考了几个帖子,但我无法从 Google 表格中填充搜索数据。我尝试使用下拉逻辑,但即使这样也不起作用。
以下是我的代码。我只粘贴看起来与你们相关的部分,因为整个事情非常杂乱无章。任何帮助将不胜感激。
加载表单.gs:
function loadForm() {
const htmlServ = HtmlService.createTemplateFromFile("uform");
const html = htmlServ.evaluate();
html.setWidth(850).setHeight(600);
const ui = SpreadsheetApp.getUi();
ui.showModalDialog(html, "VKSPCPL CRM");
}
function createMenu_(){
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu("CRM");
menu.addItem("Open APP", "loadForm");
menu.addToUi();
}
function onOpen(){
createMenu_();
}
函数.gs:
//Sales Functions---------------------------
function salesEntry(rowDataSales) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("Sales Contact Details");
const currentDate = new Date();
const uniqueIDs = ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues();
var maxNum = 0;
uniqueIDs.forEach(r => {
maxNum = r[0] > maxNum ? r[0] : maxNum
});
var caseNo = maxNum + 1;
ws.appendRow([
caseNo,
rowDataSales.inputSalesCxName,
"Sales",
rowDataSales.inputSalesCaseOwner,
currentDate,
rowDataSales.inputSalesCoName,
rowDataSales.inputSalesEmail,
rowDataSales.inputSalesPhone,
rowDataSales.inputSalesGST,
rowDataSales.inputSalesCoAdd,
rowDataSales.inputSalesState]);
return true;
}
function getSalesCaseOwnerDropdown(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("CaseOwners");
return ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues();
}
function salesStateList(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("States");
return ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues();
}
function salesContactName(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("Contact Details");
return ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues();
}
//-------------------------------------------------------------------------------------------
//Contact Functions--------------------------------------------------------------------------
function getContactDropdown(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("Customer Type");
return ws.getRange(2, 1, ws.getLastRow()-1, 2).getValues();
}
function contactEntry(rowDataContact) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("Contact Details");
const currentDate = new Date();
ws.appendRow([
rowDataContact.inputContactName,
rowDataContact.inputContactCoName,
rowDataContact.inputContactPhone,
rowDataContact.inputContactEmail,
rowDataContact.inputContactGST,
rowDataContact.inputContactCoAdd,
rowDataContact.inputContactState,
rowDataContact.inputContactCategory,
rowDataContact.inputContactType,
currentDate]);
return true;
}
function contactStateList(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("States");
return ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues();
}
uform.html:
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
</head>
<body>
<div class="container">
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">Home</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="sales-tab" data-bs-toggle="tab" data-bs-target="#sales" type="button" role="tab" aria-controls="sales" aria-selected="false">Sales</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="purchase-tab" data-bs-toggle="tab" data-bs-target="#purchase" type="button" role="tab" aria-controls="purchase" aria-selected="false">Purchase</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false">Contact Details</button>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">1</div>
<div class="tab-pane fade" id="sales" role="tabpanel" aria-labelledby="sales-tab">
<br><h3 class="display-6">New Sales Case</h3>
<div class="col-md-4">
<select class="form-select form-select-sm" aria-label=".form-select-sm example" id="inputSales-CaseOwner">
</select>
</div>
<br><h5>Contact Details</h5>
<form class="row g-3">
<div class="col-md-4">
<label for="exampleDataList" class="form-label">Datalist example</label>
<input class="form-control" list="datalistOptions" id="exampleDataList" placeholder="Type to search...">
<datalist id="inputSales-CxName">
</datalist>
...
...
...
<script>
//JS Script Here
</script>
</body>
</html>
如果你们需要更多脚本或详细信息,请告诉我。任何帮助将不胜感激。提前非常感谢!
【问题讨论】:
-
很遗憾,我无法理解
Loadform.gs和Functions.gs和uform.html之间的关系。所以我无法理解I tired a lot of methods and referred several posts, but I am not able to populate the Search data from within Google Sheet. I tried using the Dropdown Logic, but even that did not work.。我为此道歉。我可以问一下您当前问题的详细信息和您的目标吗? -
@Tanaike 嗨,已创建 loadform.gs 以将用户窗体部署为模态窗口。 Functions.gs 包含在后端运行的所有函数,uform.gs 包含所有前端 html 脚本。我的目标是在“销售标签”中有一个可搜索的下拉菜单,这将允许任何用户搜索联系人(通过“联系人标签”在“联系人详细信息”表中捕获)。记录的联系人将有几个参数:姓名、号码、电子邮件 ID 等(这些都记录在单独的列中)。(1/n)
-
@Tanaike 我希望用户可以通过输入上述任何参数从销售选项卡中的第一个可搜索下拉列表中搜索所需的联系人,但只有“联系人姓名”应该出现在用户表单中的所述字段。基于此选择,其余字段(电话、电子邮件、公司名称)应自动填充到单独的禁用下拉列表中。为之前的混乱道歉。我希望我能够解释我的问题。 (2/2)
-
感谢您的回复。当我看到你的
Functions.gs时,似乎Functions.gs的功能在Loadform.gs和uform.html上没有使用。uform.html是否独立于其他文件?如果我误解了您的问题,我深表歉意。 -
嗨@Tanaike,functions.gs 与uform.gs 相关联。 Loadform.gs 是独立的。如果您愿意,我可以将整个代码发给您以便更好地理解。我没有在这里发布它,因为它非常杂乱无章,看起来很乱
标签: javascript html google-apps-script bootstrap-modal datalist