簡體   English   中英

將提交的值添加到谷歌表中的現有單元格值

[英]Adding the submitted value to an existing cell value in google sheet

在我的谷歌表中,我有兩個標簽(付費和訂單)

用戶將這些輸入提交到付費選項卡:

B欄中的賬單編號和C欄中的支付金額

在訂單選項卡中,我在 F 列中有 header 賬單,在 G 列中有現有金額

我需要將已支付選項卡中新提交的賬單編號與訂單選項卡中的賬單列進行比較,每當我們匹配時,將已支付選項卡中新提交的已支付金額添加到訂單標簽中賬單列中匹配賬單編號旁邊的現有金額

在我的谷歌工作表腳本編輯器中,我嘗試了以下 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() }
}

表格.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>

數據已成功提交,但設置的值不起作用,並且腳本返回以下腳本已完成但未返回任何內容。

任何幫助,我將不勝感激。 提前致謝

我想提出以下修改后的腳本。 但在運行修改后的腳本之前,請確認您的電子表格設置以測試修改后的腳本。

確認:

  • 在您的腳本中,需要將Paid表的第一行設置如下。
    • “A”、“B”和“C”列分別有TimestampBillPaid Amount
    • 請在Orders表中為Bill的編號(“F”列)設置12 這樣,您修改后的 HTML 就可以進行測試了。
  • 關於 Web 應用程序的設置,在您的情況下,請使用Execute the app as: Me and Who has access to the app: Anyone, even anonymous進行測試。

當 header 行和現有的Bill值不存在時,無法測試修改后的腳本。 請注意這一點。

修改點:

  • 在您的情況下,不能使用createTemplateFromFile
  • option標簽沒有價值。
  • Bill放入header時,不能使用Bill #的名稱。
  • 當您想使用BillPaid 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();
  }
}

筆記:

  • 當您修改 Web Apps 的腳本時,請將 Web Apps 重新部署為新版本。 這樣,最新的腳本就會反映到 Web 應用程序中。 請注意這一點。
  • 在您的腳本中,當Confirmation.html不存在時,會發生錯誤。 請注意這一點。
  • 我認為您的情況(包括修改后的腳本)可能有點復雜。 在我的環境中,我可以確認修改后的腳本有效。 但是,當您測試修改后的腳本時,如果該腳本無法達到您的預期結果,您能否提供包含當前腳本的示例電子表格以復制問題? 借此,我想確認一下。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM