Отправить данные в переменной (не в форме отправки) на листе Google - PullRequest
0 голосов
/ 03 июня 2019

Я новичок в Vue.js и javascript. Я пытаюсь отправить некоторые данные на страницу Google безуспешно.

Я нашел некоторую информацию о том, как разместить данные, но мои данные не сохраняются в форме. Поэтому я добавил пустую «форму» с данными, которые хочу опубликовать без удачи.

Это источник: https://github.com/jamiewilson/form-to-google-sheets а также: Можно ли отправлять переменные js на листы Google? (Не данные формы)

Вот как я размещаю данные:

saveToGoogleSheet () {
  const scriptURL = 'https://script.google.com/macros/s/.../exec'
  const form = ''
  var sendingData = new FormData(form)
  sendingData.append('starRating', this.feedbackData.starRating)

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

это скрипт google

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

После запуска приложения я получаю сообщение об успехе:

Success!
Response {type: "cors", url: "https://script.googleusercontent.com/macros/echo?u…xxx", redirected: true, status: 200, ok: true, …}
body: ReadableStream
bodyUsed: false
headers: Headers
__proto__: Headers
ok: true
redirected: true
status: 200
statusText: ""
type: "cors"
url: "https://script.googleusercontent.com/macros/echo?user_content_key=..."
__proto__: Response

но электронная таблица Google не заполняется, и все же данные существуют, если я его укажу.

1) Что я делаю не так?

2) Кроме того, есть ли способ отправить данные без добавления пустой формы?

3) Наконец, что если я хочу отправить больше данных, могу ли я сделать что-то вроде

sendingData.append({
  'starRating' = this.feedbackData.starRating
  'nowReading' = this.feedbackData.nowReading
})

или мне нужно сделать:

sendingData.append('starRating', this.feedbackData.starRating)
sendingData.append('nowReading', this.feedbackData.nowReading)

или что?

- ОБНОВЛЕНИЕ -

после публикации вопроса я решил начать заново с Google Sheet. в результате я теперь размещаю данные на листе, но они «неопределенные», несмотря на то, что данные есть до и после проводки:

console.log(this.feedbackData)
this.saveToGoogleSheet()
console.log(this.feedbackData)

Я попробовал одну переменную, как указано выше, или опубликовал все переменные одновременно (большинство из которых были «неопределенными» на момент публикации) следующим образом:

saveToGoogleSheet () {
  const scriptURL = 'https://script.google.com/macros/s/.../exec'
  fetch(scriptURL, {method: 'POST', body: JSON.stringify(this.feedbackData)})
    .then(response => console.log('Success!', response))
    .catch(error => console.error('Error!', error.message))
}

и вот так:

saveToGoogleSheet () {
  const scriptURL = 'https://script.google.com/macros/s/.../exec'
  fetch(scriptURL, {method: 'POST', body: this.feedbackData})
    .then(response => console.log('Success!', response))
    .catch(error => console.error('Error!', error.message))
}

но результат тот же.

Мой JSON.stringify (this.feedbackData) выглядит так:

{"userName":"","userNumber":"","friendName":"","friendNumber":"","inviteMessage":"","nowReading":"S2/E1/","starRating":"4"}

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я нашел проблему:

здесь:

saveToGoogleSheet () {
  const scriptURL = 'https://script.google.com/macros/s/.../exec'
  const form = ''
  var sendingData = new FormData(form)
  sendingData.append('starRating', this.feedbackData.starRating)

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

Я должен изменить это:

fetch(scriptURL, {method: 'POST', body: new FormData(sendingData)})

в это:

fetch(scriptURL, {method: 'POST', body: sendingData})

Кроме того, мне не нужно const form = '', если я поставлю var sendingData = new FormData('')

0 голосов
/ 04 июня 2019
  • Вы уже развернули веб-приложения для принятия значения.
  • Вы хотите поместить значения в электронную таблицу, как показано на рисунке ниже, отправив объект {"userName":"","userNumber":"","friendName":"","friendNumber":"","inviteMessage":"","nowReading":"S2/E1/","starRating":"4"} с fetch() из Javascript.

enter image description here

Если мое понимание верно, как насчет этой модификации?

Очки модификации:

  • Когда значение отправляется методом POST, его можно получить с помощью e.postData.contents из e или doPost(e).
    • Но в этом случае значение необходимо отправить в виде строки. Поэтому, пожалуйста, используйте JSON.parse().
    • Поэтому, пожалуйста, используйте body: JSON.stringify(this.feedbackData)} на fetch() стороне.

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

Сценарий Google Apps:

От:
var newRow = headers.map(function(header) {
  return header === 'timestamp' ? new Date() : e.parameter[header]
})
Для того, чтобы:
var params = JSON.parse(e.postData.contents); // Added
var newRow = headers.map(function(header) {
  return header === 'timestamp' ? new Date() : params[header]; // Modified
});

Javascript:

Пожалуйста, используйте приведенный выше скрипт раздела "ОБНОВЛЕНИЕ" в вашем вопросе.

saveToGoogleSheet () {
  const scriptURL = 'https://script.google.com/macros/s/.../exec'
  fetch(scriptURL, {method: 'POST', body: JSON.stringify(this.feedbackData)})
    .then(response => console.log('Success!', response))
    .catch(error => console.error('Error!', error.message))
}

Примечание:

  • При изменении скрипта Google Apps для веб-приложений разверните веб-приложения в качестве новой версии. Таким образом, последний скрипт отражается на веб-приложениях. Пожалуйста, будьте осторожны.
  • Я не уверен насчет вашей настоящей таблицы. Если он отличается от приведенного выше изображения, измените сценарий для вашей ситуации.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...