#google-apps-script #google-sheets
Вопрос:
В моей html-форме есть несколько полей, однако я хочу, чтобы только идентификатор, подтверждение, Вопросы и заметки были размещены в соответствующих столбцах на моем листе:
Как я могу этого достичь? Я смог разместить только «все» поля формы в их столбцах на основе того же имени заголовка, что и мое имя формы=»» значение.
Я хочу, чтобы только идентификатор, подтверждение, вопросы и заметки отображались в их правых столбцах.
Мой Code.gs:
var scriptProp = PropertiesService.getScriptProperties()
function intialSetup () {
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', activeSpreadsheet.getId())
}
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
try {
var sheetName = e.parameter.svdate.split("/").splice(0, 2).map(function(e){return e.replace(/^0/, "")}).join("/");
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'));
var sheet = doc.getSheetByName(sheetName);
if (!sheet) throw new Error("Sheet Name was not found.");
var headers = sheet.getRange(1, 1, 1, 10).getValues()[0]
var nextRow = sheet.getLastRow() 1
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext();
sheet.getRange(find ? find.getRow() : nextRow, 1, 1, newRow.length).setValues([newRow]);
return ContentService
.createTextOutput(e.parameter.callback "(" JSON.stringify({ 'result': 'success', 'row': nextRow }) ")")
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
catch (e) {
return ContentService
.createTextOutput(e.parameter.callback "(" JSON.stringify({ 'result': 'error', 'error': e }) ")")
.setMimeType(ContentService.MimeType.JAVASCRIPT)
}
finally {
lock.releaseLock()
}
}
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- При отправке HTML-формы вы хотите поместить в электронную таблицу только значения
id, Confirmation, Questions, and Notes
.
В этом случае, как насчет следующей модификации?
От:
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
Для:
var keys = ["id", "confirmation", "questions", "notes"];
var newRow = headers.map(function (header) { return header === 'timestamp' ? new Date() : keys.includes(header.toLowerCase()) ? e.parameter[header] : "" });
- В этой модификации с помощью
keys
извлекаются значения определенных ключей.
Ссылка:
Добавлен:
Из вашего следующего ответа,
Привет, Танайке. У меня есть одна проблема с вашим предложенным кодом. Он заменяет значение других столбцов на null, например, Способ оплаты, Клиент LA, Уборщики и т. Д.
В этом случае, пожалуйста, измените свой сценарий в своем вопросе следующим образом.
От:
var newRow = headers.map(function(header) {
return header === 'timestamp' ? new Date() : e.parameter[header]
})
var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext();
sheet.getRange(find ? find.getRow() : nextRow, 1, 1, newRow.length).setValues([newRow]);
Для:
var keys = ["id", "confirmation", "questions", "notes"];
var newRow = headers.map(function (header) { return header === 'timestamp' ? new Date() : ~keys.indexOf(header.toLowerCase()) ? e.parameter[header] : "" });
var find = sheet.getRange(1, 1, sheet.getLastRow()).createTextFinder(newRow[0]).matchEntireCell(true).findNext();
if (find) {
var range = sheet.getRange(find.getRow(), 1, 1, newRow.length);
var rowValue = range.getValues()[0].map(function(c, i) {return newRow[i] || c});
range.setValues([rowValue]);
} else {
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);
}
Комментарии:
1. Привет, Танайке. Это выдает ошибку в консоли моего браузера о политике Cors и это: Ошибка! Не удалось извлечь
2. @geeksified Спасибо, что ответили. Я приношу извинения за причиненные неудобства. К сожалению, я не могу повторить вашу ситуацию
It throws an error on my browser console about Cors Policy and this: Error! Failed to fetch
. Это связано с моим плохим мастерством. Я глубоко извиняюсь за это. Чтобы правильно понять вашу текущую ситуацию, можете ли вы предоставить образец электронной таблицы и свой текущий сценарий для репликации вашей проблемы? Этим я хотел бы подтвердить это.3. У тебя все хорошо получается. Спасибо. Вот лист: docs.google.com/spreadsheets/d/… Это выше имеет несколько столбцов. Из моей HTML-формы я хотел опубликовать только идентификатор, Подтверждение, Вопросы и заметки, сохранив при этом содержимое других столбцов.
4. @geeksified Спасибо, что ответили. Когда я увидел образец вашей электронной таблицы и ваш текущий сценарий, мне показалось, что в проекте сценариев Google Apps существуют одни и те же имена функций. Например, существует 2
doPost
функции. В этом случае сценарий может не сработать. Я беспокоюсь об этом. Кроме того, ваш текущий сценарий не отражает предложенную мной модификацию. Таким образом, я не могу воспроизвести вашу текущую проблему. Я приношу свои извинения за это. Итак, можете ли вы предоставить образец электронной таблицы и текущий сценарий для репликации вашей текущей проблемы? Этим я хотел бы подтвердить это.5. Привет, Танайке. Мне жаль, что я работал над этим в последнее время. Теперь я использую предложенный вами код и удалил другой доПост. Это все равно не работает. 🙁 Моя HTML-форма зависает, когда я нажимаю кнопку отправить. И моя консоль браузера выдает эту ошибку: prnt.sc/15nyyk1