我已经使用 Google 脚本创建了一个网络应用程序。它目前按我想要的方式工作,没有例外。在网络应用程序上,我尝试创建一个表格,其中填充来自谷歌工作表的数据,并在需要时编辑/更新行。当我运行控制台记录器时,它显示收到的数据:null。在过去的三四天里,我一直在尝试找出我没有做什么,但似乎无法让它填充。
下面是我的index.html。
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function getRecords() {
try {
var sheet = SpreadsheetApp.openById('16b_cRhhtLSqZqGqZ3bwigHleOLNYQGhGB0FGkc8j7nk').getSheetByName('Data'); // Change 'Jobs' to your actual sheet name
if (!sheet) {
Logger.log('Sheet not found');
return [];
}
var dataRange = sheet.getDataRange();
var values = dataRange.getValues();
// Log the entire values array
Logger.log('Values:', values);
// Check if there are headers in the first row
if (values.length < 1) {
Logger.log('No headers found.');
return [];
}
// Extract headers from the first row
var headers = values[0];
// Log the headers array
Logger.log('Headers:', headers);
// Convert 2D array to a 1D array of objects (assuming the first row contains headers)
var records = [];
for (var i = 1; i < values.length; i++) {
var record = {};
for (var j = 0; j < headers.length; j++) {
// Check if the value is present before assigning to the record
record[headers[j]] = values[i][j] !== undefined ? values[i][j] : null;
}
records.push(record);
}
if (records.length > 0) {
Logger.log('Retrieved records:', records);
} else {
Logger.log('No records found.');
}
return records;
} catch (error) {
Logger.log('Error in getRecords:', error.message); // Log the error message
return [];
}
}
function addRecord(data) {
var sheet = SpreadsheetApp.openById('16b_cRhhtLSqZqGqZ3bwigHleOLNYQGhGB0FGkc8j7nk').getSheetByName('Data');
sheet.appendRow(data);
}
function updateRecord(row, data) {
var sheet = SpreadsheetApp.openById('16b_cRhhtLSqZqGqZ3bwigHleOLNYQGhGB0FGkc8j7nk').getSheetByName('Data');
var rowIndex = row + 2; // Adjusted row index for header
sheet.getRange(rowIndex, 1, 1, 13).setValues([data]);
}
function deleteRecord(row) {
var sheet = SpreadsheetApp.openById('16b_cRhhtLSqZqGqZ3bwigHleOLNYQGhGB0FGkc8j7nk').getSheetByName('Data');
sheet.deleteRow(row + 2); // Adjusted row index for header
}
<!DOCTYPE html>
<html>
<head>
<title>Job Management System</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
</head>
<body>
<h1>Job Management System</h1>
<!-- Form to Add or Edit Record -->
<h2>Add/Edit Record</h2>
<form id="jobForm">
<label for="jobNumber">Job Number:</label>
<input type="text" id="jobNumber" name="jobNumber"><br><br>
<label for="streetAddress">Street Address:</label>
<input type="text" id="streetAddress" name="streetAddress">
<label for="city">City:</label>
<input type="text" id="city" name="city"><br><br>
<label for="statusDescription">Status Description:</label>
<input type="text" id="statusDescription" name="statusDescription">
<label for="dateReceived">Date Received:</label>
<input type="date" id="dateReceived" name="dateReceived">
<label for="dueDate">Due Date:</label>
<input type="date" id="dueDate" name="dueDate"><br><br>
<label for="fieldSupervisor">Field Supervisor:</label>
<input type="text" id="fieldSupervisor" name="fieldSupervisor">
<label for="customerSupervisor">Customer Supervisor:</label>
<input type="text" id="customerSupervisor" name="customerSupervisor"><br><br>
<label for="priority">Priority:</label>
<input type="text" id="priority" name="priority">
<label for="jobClass">Job Class:</label>
<input type="text" id="jobClass" name="jobClass"><br><br>
<label for="contractor">Contractor:</label>
<input type="text" id="contractor" name="contractor">
<label for="dateCompleted">Date Completed:</label>
<input type="date" id="dateCompleted" name="dateCompleted"><br><br>
<label for="notes">Notes:</label>
<textarea id="notes" name="notes"></textarea><br><br>
<button type="button" onclick="addOrUpdateRecord()">Add/Update Record</button>
</form>
<!-- Display Records Table -->
<h2>Job Records</h2>
<table border="1" id="jobTable">
<thead>
<tr>
<th>Job Number</th>
<th>Street Address</th>
<th>City</th>
<th>Status Description</th>
<th>Date Received</th>
<th>Due Date</th>
<th>Field Supervisor</th>
<th>Customer Supervisor</th>
<th>Priority</th>
<th>Job Class</th>
<th>Contractor</th>
<th>Date Completed</th>
<th>Notes</th>
<th>Action</th>
</tr>
</thead>
<tbody id="jobTableBody">
<!-- Records will be populated here -->
</tbody>
</table>
<!-- Script Section -->
<script>
// Function to fetch and display data on window load
window.onload = function () {
google.script.run.withSuccessHandler(populateTable).getRecords();
console.log("Window loaded");
}
// Function to add or update a record
function addOrUpdateRecord() {
console.log("Add or Update Record function called");
// Retrieve values from form fields
var jobNumber = document.getElementById('jobNumber').value;
var streetAddress = document.getElementById('streetAddress').value;
var city = document.getElementById('city').value;
var statusDescription = document.getElementById('statusDescription').value;
var dateReceived = document.getElementById('dateReceived').value;
var dueDate = document.getElementById('dueDate').value;
var fieldSupervisor = document.getElementById('fieldSupervisor').value;
var customerSupervisor = document.getElementById('customerSupervisor').value;
var priority = document.getElementById('priority').value;
var jobClass = document.getElementById('jobClass').value;
var contractor = document.getElementById('contractor').value;
var dateCompleted = document.getElementById('dateCompleted').value;
var notes = document.getElementById('notes').value;
// Create an array with form field values
var data = [jobNumber,streetAddress,city,statusDescription,dateReceived,dueDate,fieldSupervisor,customerSupervisor,priority,jobClass,contractor,dateCompleted,notes];
// Call the server-side function to add or update the record
google.script.run.withSuccessHandler(function () {
document.getElementById('jobForm').reset();
fetchAndDisplayData();
}).addRecord(data);
}
// Function to edit a record
function editRecord(row, record) {
var selectedRecord = JSON.parse(record);
console.log("Edit button clicked. Row:", row, "Record:", selectedRecord);
// Populate form fields with selected record data
document.getElementById('jobNumber').value = selectedRecord[0];
document.getElementById('streetAddress').value = selectedRecord[1];
document.getElementById('city').value = selectedRecord[2];
document.getElementById('statusDescription').value = selectedRecord[3];
document.getElementById('dateReceived').value = selectedRecord[4];
document.getElementById('dueDate').value = selectedRecord[5];
document.getElementById('fieldSupervisor').value = selectedRecord[6];
document.getElementById('customerSupervisor').value = selectedRecord[7];
document.getElementById('priority').value = selectedRecord[8];
document.getElementById('jobClass').value = selectedRecord[9];
document.getElementById('contractor').value = selectedRecord[10];
document.getElementById('dateCompleted').value = selectedRecord[11];
document.getElementById('notes').value = selectedRecord[12];
}
// Function to delete a record
function deleteRecord(row) {
google.script.run.withSuccessHandler(fetchAndDisplayData).deleteRecord(row);
}
// Function to fetch and display data
function fetchAndDisplayData() {
google.script.run.withSuccessHandler(populateTable).getRecords();
}
// Function to populate the table with records
function populateTable(records) {
console.log("Data received:", records); // Log the received data
var tableBody = document.getElementById('jobTableBody');
tableBody.innerHTML = '';
if (records && records.length > 0) {
for (var i = 0; i < records.length; i++) {
var row = records[i];
var newRow = tableBody.insertRow(-1);
for (var j = 0; j < row.length; j++) {
var cell = row[j];
var newCell = newRow.insertCell(-1);
newCell.textContent = cell;
}
var actionsCell = newRow.insertCell(-1);
actionsCell.innerHTML = '<button onclick="editRecord(' + i + ', \'' + JSON.stringify(row).replace(/'/g, "\\'") + '\')">Edit</button> <button onclick="deleteRecord(' + i + ')">Delete</button>';
}
} else {
console.log("No records found."); // Log when no records are found
var noRecordsRow = tableBody.insertRow(-1);
var noRecordsCell = noRecordsRow.insertCell(-1);
noRecordsCell.colSpan = 15; // Set the colspan to the number of columns in your table
noRecordsCell.textContent = "No records found.";
}
}
</script>
</body>
</html>
我通过修改这两个函数将数据存入表中:
function getRecords() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var rg = sheet.getDataRange();
var [hs, ...vs] = rg.getValues();
return {headers: hs, records:vs};
}
function populateTable(obj) {
console.log("Header received: %s", obj.headers)
console.log("Data received:", obj.records); // Log the received data
var tableBody = document.getElementById('jobTableBody');
tableBody.innerHTML = '';
var records = obj.records;
if (records && records.length > 0) {
for (var i = 0; i < records.length; i++) {
var row = records[i];
console.log("Row: [%s] = %s",i,JSON.stringify(row));
var newRow = tableBody.insertRow(-1);
for (var j = 0; j < row.length; j++) {
var cell = row[j];
console.log("Cell[%s][%s] = %s",i,j,row[j])
var newCell = newRow.insertCell(-1);
newCell.textContent = cell;
}
var actionsCell = newRow.insertCell(-1);
actionsCell.innerHTML = '<button onclick="editRecord(' + i + ', \'' + JSON.stringify(row).replace(/'/g, "\\'") + '\')">Edit</button> <button onclick="deleteRecord(' + i + ')">Delete</button>';
}
} else {
console.log("No records found."); // Log when no records are found
var noRecordsRow = tableBody.insertRow(-1);
var noRecordsCell = noRecordsRow.insertCell(-1);
noRecordsCell.colSpan = 15; // Set the colspan to the number of columns in your table
noRecordsCell.textContent = "No records found.";
}
}
您可能还想拥有:
<style>
th,td {border:1px solid black;}
</style>