【问题标题】:Is it possible to send js variables to google sheets? (Not form data)是否可以将 js 变量发送到谷歌表格? (不是表格数据)
【发布时间】:2018-08-09 13:56:57
【问题描述】:

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

这是当前的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))

                  });

这里是我想用表单数据添加到谷歌表的变量的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 变量并发送到谷歌表格。表格工作在那里没有问题。我找不到任何关于如何在不使用标签的情况下将变量发送到工作表的信息。我什至一直在搞乱将对象转换为表单数据。并且没有关于如何将表单数据以及 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()
  }
}

【问题讨论】:

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


【解决方案1】:

看来你问题的核心是

如何创建 fetch() 的主体参数,使其包含表单数据对象和 JavaScript 变量中的其他值。

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()。

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

相关问题

参考文献

【讨论】:

  • 谢谢,非常感谢
【解决方案2】:

虽然使用 doPost 函数可以工作,但使用 google.script.run 从附加到 Google 电子表格的有界脚本发送数据可能更方便,正如 HTML Service: Communicate with Server Functions 所建议的那样。

相关

【讨论】:

  • 感谢您的链接。您能否给我一个代码示例,说明我将如何获取表单数据以及变量并使用 google.script.run 发送到 google 工作表。你能告诉我如何使用 POST 来做同样的事情吗?感谢您的帮助
  • @LexRidley 链接页面有示例。你已经研究过它们了吗?他们有什么不清楚的地方?关于展示如何使用 POST,请发布一个新问题,包括 minimal reproducible example 和您的搜索/研究工作的简要说明(我很确定本网站上已经有示例)。
  • 是的,我有,但不明白。也不知道这有什么帮助,所以我可以同时获取表格和可变数据。我已经提供了所有必要的信息,一些基本的 html 表单并不能增强我的问题。我认为您对提供更彻底的答案不太感兴趣。谢谢你的时间,但你的回答根本没有回答我的问题,只会让它变得更复杂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多