Переместите выбранные значения в определенные столбцы

#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