Добавление отправленного значения к существующему значению ячейки в листе Google - PullRequest
1 голос
/ 14 июля 2020

в моем листе Google у меня есть две вкладки (Оплаченные и заказы)

Пользователь отправляет эти данные на вкладку Оплаченные:

Номер счета в столбце B и Оплаченная сумма в столбце C

На вкладке "Заказы" у меня есть заголовок "Счета" в столбце F и существующая сумма в столбце G

Мне нужно сравнить номер нового отправленного счета на вкладке "Оплаченные" с столбцом счетов на вкладке "Заказы" и всякий раз, когда мы есть совпадение, добавьте новую отправленную оплаченную сумму на вкладке «Оплачено» к существующей сумме рядом с соответствующим номером счета в столбце счетов на вкладке «Заказы»

В моем редакторе скриптов таблицы Google я попробовал следующий код gs:

function doGet() {
return HtmlService.createTemplateFromFile('Form.html');
}

function doPost (e) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);

try {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName("Paid");
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
return header === 'Timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])

var bill = newRow[1];
var paidAmount = newRow[2];
var sh = doc.getSheetByName("Orders");
var bills = sh.getRange(2, 6, sh.getLastRow()-1, 1).getValues();

if (bills.flat().indexOf(bill) != -1) {
var existingAmount = sh.getRange(bills.flat().indexOf(bill)+2, 7).getValue();
var total = +existingAmount + +paidAmount
sh.getRange(bills.flat().indexOf(bill)+2, 7).setValue(total);
return HtmlService.createTemplateFromFile('Confirmation.html');
}
}

catch (e) {
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
.setMimeType(ContentService.MimeType.JSON)
}

finally { lock.releaseLock() }
}

Form. html

<!DOCTYPE html>
<head>
<base target="_top">
</head>

<body>
<form action="ScriptURL" method="POST">
<select name="Bill #" required>
<option value="" disabled selected>Select ..</option>
<option value="">1</option>
<option value="">2</option>
</select>
<input type="number" placeholder="Paid" name="Paid Amount" required>
<button type="submit">Submit</button>
</form>
</body>
</html>

Данные отправлены успешно, но установленное значение не работает, а также скрипт возвращает следующее Скрипт завершился, но ничего не вернул.

Любая помощь, я был бы очень благодарен. Заранее спасибо

1 Ответ

0 голосов
/ 15 июля 2020

Я хотел бы предложить следующий модифицированный сценарий. Но перед запуском измененного скрипта подтвердите свои настройки электронной таблицы для тестирования измененного скрипта.

Подтверждение:

  • В вашем скрипте необходимо установить первую строку листы Paid следующим образом.
    • В столбцах «A», «B» и «C» указаны Timestamp, Bill и Paid Amount соответственно.
    • И укажите 1 и 2 для номеров Bill (графа «F») в листе Orders. Таким образом, ваш измененный HTML может быть протестирован.
  • Что касается настроек веб-приложений, в вашем случае, пожалуйста, проверьте с Execute the app as: Me и Who has access to the app: Anyone, even anonymous.

Когда строка заголовка и существующее значение Bill не существуют, модифицированный сценарий не может быть протестирован. Будьте осторожны.

Пункты модификации:

  • В вашем случае createTemplateFromFile нельзя использовать.
  • option тег не имеет значения.
  • Когда вы помещаете Bill в заголовок, имя Bill # использовать нельзя.
  • Если вы хотите использовать значения Bill и Paid Amount в качестве числа, var bill = newRow[1]; и var paidAmount = newRow[2]; - строковый тип. Таким образом, bills.flat().indexOf(bill) != -1 всегда false. Итак, скрипт в операторе if не запускается.
  • Я думаю, что в вашем случае var total = +existingAmount + +paidAmount можно изменить на var total = existingAmount +paidAmount.
  • В вашем скрипте, когда значение Bill не соответствует на листе Orders, возвращается ошибка.

Когда указанные выше точки отражаются в вашем скрипте, это становится следующим:

Измененный скрипт:

HTML и Javascript сторона: Form.html

<html>

<head>
  <base target="_top">
</head>

<body>
  <form action="https://script.google.com/macros/s/###/exec" method="POST">
    <select name="Bill" required>
      <option value="" disabled selected>Select ..</option>
      <option value="1">1</option>
      <option value="2">2</option>
    </select>
    <input type="number" placeholder="Paid" name="Paid Amount" required>
    <button type="submit">Submit</button>
  </form>
</body>

</html>

Сторона скрипта Google Apps: Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Form.html');
}

function doPost (e) {
  var lock = LockService.getScriptLock();
  lock.tryLock(10 * 1000);
  try {
    var doc = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = doc.getSheetByName("Paid");
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
    var nextRow = sheet.getLastRow() + 1
    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    })
    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
    var bill = Number(newRow[1]);
    var paidAmount = Number(newRow[2]);
    var sh = doc.getSheetByName("Orders");
    var bills = sh.getRange(2, 6, sh.getLastRow()-1, 1).getValues();
    if (bills.flat().indexOf(bill) != -1) {
      var existingAmount = sh.getRange(bills.flat().indexOf(bill)+2, 7).getValue();
      var total = existingAmount + paidAmount;
      sh.getRange(bills.flat().indexOf(bill)+2, 7).setValue(total);
      return HtmlService.createHtmlOutputFromFile('Confirmation.html');
    }
    return ContentService.createTextOutput("Value was not changed.");
  } catch (e) {
    return ContentService
    .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
    .setMimeType(ContentService.MimeType.JSON);
  } finally {
    lock.releaseLock();
  }
}

Примечание:

  • Когда вы изменили скрипт веб-приложений, повторно разверните веб-приложения как новую версию. Таким образом, последний сценарий отражается в веб-приложениях. Будьте осторожны.
  • В вашем скрипте, когда Confirmation.html не существует, возникает ошибка. Пожалуйста, будьте осторожны.
  • Я думаю, что ваша ситуация, включая измененный скрипт, может быть немного сложной. В своей среде я мог подтвердить, что измененный сценарий работает. Но при тестировании измененного сценария, если сценарий не сработал для ожидаемого результата, можете ли вы предоставить образец электронной таблицы, включая текущий сценарий для репликации проблемы? Этим я хотел бы это подтвердить.

Ссылки:

...