Ошибка в Google App Script при отправке данных формы в Google Sheets

161
31 декабря 2020, 12:30

Цель - отправить данные формы в Google Sheets для записи в соответствующие поля. Я использовал эту статью, но мой скрипт выдает ошибку:

{
"result": "error",
  "Error in: ": {
  "message": "Invalid argument: id",
  "name": "Exception",
  "fileName": "Code",
  "lineNumber": 20,
  ""smack": "\that Code:20 (handleResponse)\n\tat Code:2 (doGet)\n"
  }
}

Помогите мне выяснить, какую ошибку я допустил в скрипте Служб Google, или подскажите, как можно самостоятельно ее диагностировать.

Google Apps Script:

function doGet(e){
  return handleResponse(e);
}
//  Enter sheet name where data is to be written below
        var SHEET_NAME = "Table";
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
function handleResponse(e) {
  // shortly after my original solution Google announced the LockService[1]
  // this prevents concurrent access overwritting data
  // [1] http://googleappsdeveloper.blogspot.co.uk/2011/10/concurrency-and-google-apps-script.html
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
    var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var sheet = doc.getSheetByName(SHEET_NAME);
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow()+1; // get next row
    var row = []; 
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
        row.push(new Date());
      } else { // else use header name to get data
        row.push(e.parameter[headers[i]]);
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    // return json success results
    return ContentService
          .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(e){
    // if error return this
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  } finally { //release lock
    lock.releaseLock();
  }
}
function setup() {
    var doc = SpreadsheetApp.getActiveSpreadsheet();
    SCRIPT_PROP.setProperty("key", doc.getId());
}
Answer 1

Судя по стеку, в свойствах скрипта нет нужного идентификатора Таблицы. Т.е. SCRIPT_PROP.getProperty("key") ничего полезного не возвращает.

До того, как запускать вы должны установить значение ключа key в значение идентификатора Таблицы. Вставьте и запустите следующий код вручную

function customInit(){
  SCRIPT_PROP.setProperty("key", "<Тут_ID_Таблицы>")
}

При внесении каких-либо изменений в коде, не забывайте выпускать и публиковать новую версию приложения.

READ ALSO
Выбрать первые 3 созданные экземпляра класса JavaScript

Выбрать первые 3 созданные экземпляра класса JavaScript

Всем привет! Возникла задача: Существует n кол-во дивов с одним классом и надо выбрать именно первые 3 div с помощью JS или JQНикак не могу найти...

117
Как уменьшить окно элемента `select`?

Как уменьшить окно элемента `select`?

Сейчас работаю с формой, где пользователь должен заполнить поля и выбрать тип из элемента selectНо при нажатие на select, отоброжается слишком...

129
Активность пользователя JS, JQuery

Активность пользователя JS, JQuery

Возможно ли на JS определить активность пользователя?

128
parcel html настройка проекта

parcel html настройка проекта

Коллеги такой вопросИспользую сборщик parcel

107