javascript - 是否可以将 js 变量发送到 google 表格? (不是表单数据)

标签 javascript html google-apps-script google-sheets fetch

我有一些变量是根据用户在我的网络应用程序上的选择而创建的。我想将这些变量发送到谷歌工作表 - 这可能吗?我已经将数据从表单发送到谷歌表格。因为变量是在用户提交表单的同时创建的,所以我想将表单数据和这些变量一起放入工作表中。

这是当前的js(为了简洁起见,留下了html形式):

$('#CompleteOrder').on('click', function(event){
                        event.preventDefault();

                        const scriptURL = 'https://script.google.com/macros/s/...................'
                        const form = document.forms['submit']

                        fetch(scriptURL, { method: 'POST', body: new FormData(form)})
                        .then(response => console.log('Success!', response))
                        .catch(error => console.error('Error!', error.message))

                  });

这里是我想使用表单数据添加到 google 工作表的变量的 js:

var ti = 1;
            $.each(products, function (i) {
                var productID = Number(products[i]['id']);
                var productImage = products[i]['image'];
                var productColor = products[i]['color'];
                var productSize = products[i]['size'];
                var productName = products[i]['name'];
                var productPrice = Number(products[i]['price']);
                var productQty = Number(products[i]['qty']);

                body = body + '<tr><td><span>' + productName + '</span></td><td><span>' + productColor + '</span></td><td><span>' + productSize + 'L</span></td><td><span data-prefix>$</span><span >' + productPrice + '</span></td><td><span>' + productQty + '</span></td><td><span data-prefix>$</span><span>' + (productPrice * productQty) + '</span></td></tr>';
                total = total + (productPrice * productQty);


            });

谢谢

编辑:

我被卡住的地方是如何获取一个 js 变量并发送到 google 工作表。该表格有效,那里没有问题。我找不到任何关于如何在不使用标签的情况下将变量发送到工作表的信息。我什至一直在搞乱将对象转换为表单数据。并且没有关于如何将表单数据和 js 变量发送到同一张表的解释。

Form

<form name="submit">
                            <div class="form-group">
                                <label for="cus-name">Name</label>
                                <input type="text" name="name" class="form-control form-control" id="cus-name"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-address">Street Address</label>
                                <input type="text" name="address" class="form-control form-control" id="cus-address"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-city">City</label>
                                <input type="text" name="city" class="form-control form-control" id="cus-city"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-state">Province</label>
                                <input type="text" name="province" class="form-control form-control" id="cus-state"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-zipcode">Zipcode</label>
                                <input type="text" name="zip" class="form-control form-control" id="cus-zipcode"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-phone">Phone Number</label>
                                <input type="text" name="number" class="form-control form-control" id="cus-phone"></input>
                            </div>
                            <div class="form-group">
                                <label for="cus-email">Email Address</label>
                                <input type="email" name="email" class="form-control form-control" id="cus-email"></input>
                            </div>




                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
                        <button type="submit" class="btn btn-success" id="CompleteOrder">Complete Order</button>
                    </div>

                                           </form>

谷歌脚本

var sheetName = 'Sheet1'
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 doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
    var sheet = doc.getSheetByName(sheetName)

    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])

    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON)
  }

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

  finally {
    lock.releaseLock()
  }
}

最佳答案

看来你问题的核心是

How to to create the fetch()'s body argument in such way that it includes both the form data object and other values from JavaScript variables.

new FormData(form) 返回一个 FormData 对象。

要将 HTML 表单中未包含的值添加到现有的 FormData 使用 FormData.append()

将上述应用到代码以添加一个值的一种方法是替换

fetch(scriptURL, { method: 'POST', body: new FormData(form)})
                        .then(response => console.log('Success!', response))
                        .catch(error => console.error('Error!', error.message))

通过类似的东西:

var something = 'New value';
var fetchBody = new FormData(form);
fetchBody.append('newKey',something);
fetch(scriptURL, { method: 'POST', body: fetchBody})
                        .then(response => console.log('Success!', response))
                        .catch(error => console.error('Error!', error.message))

要添加更多变量,请根据需要添加更多 fetchBody.append()。

注意:我还没有测试上面的内容。

相关问题

引用资料

关于javascript - 是否可以将 js 变量发送到 google 表格? (不是表单数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768959/

相关文章:

javascript - 改变 React 状态对象中的值

html - 如何在服务器端获取浏览器的屏幕分辨率?

html - 悬停背景显示不正确?

javascript - 在 Google Apps 脚本中将文本替换为 HTML

java - Google Apps 脚本中连接的 JDBC 证书要求

javascript - 了解非捕获组的正则表达式

javascript - 使用javascript控制css3立方体效果

html - jpeg 图像无法通过 <img> 标签加载...png/gif 工作正常吗?

javascript - 根据条件检索Google表格中的选择性行

javascript - Angular Directive(指令)双向范围不更新模板