Могу ли я иметь форму с несколькими вариантами выбора Google, связанную с листом Google? - PullRequest
2 голосов
/ 28 октября 2019

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

На листе 'Lots' в листах Google у меня есть таблица в диапазоне A1: F11, включая строки заголовка. В этом диапазоне будет больше строк, поскольку я получаю пожертвования лотов на аукцион.

У меня также есть настроенная форма Google, которую я хотел бы связать с данными, которые я ввел на листе лотов. Я хотел бы пройтись по каждой строке листа Lots и добавить имя лота в столбце B в MultipleChoiceItem в моей форме.

    function myFunction() {

    var form = FormApp.openByUrl(
     'FORM LINK'
     )
    var workbook  = SpreadsheetApp.openByUrl(
     'SHEET LINK')

    var sheet = book.getSheets()[0];

    itemArray = "VALUES FROM SHEET"

    var item = form.addMultipleChoiceItem();
    item.setTitle('Auction Lots')
    .setChoices([

    item.createChoice('ItemArray'),

     ])

     }

Я написал код выше, но на самом деле не знаю, как добавить мои данные листа в массив. В дополнение к этому, я хотел бы добавить описание, резервную цену и текущую максимальную ставку из столбцов C, D и E к списку товаров, но, надеюсь, как только я преодолею это первое препятствие, это станет меньшей проблемой!

Возможно ли то, что я пытаюсь сделать?

TIA!

1 Ответ

0 голосов
/ 28 октября 2019

Я создал пример Формы [1] и Электронной таблицы [2] на основе вашего описания процесса. Я разработал приведенный ниже код, чтобы обновить самую высокую цену в листах, когда пользователь отправляет форму, только если цена предложения в ответе выше текущей. Для этого я использовал документацию по триггерам [3], сервисам Form [4] и Spreadsheet [5].

Вам нужно один раз запустить функцию createOnSubmitTrigger, чтобы создать триггер, который будет запускать функцию runOnFormSubmit, когдапользователь отправляет ответ в форме:

function runOnFormSubmit(e) {
  //Get Form and Sheet objects
  var form = FormApp.openByUrl('Form-URL')
  var workbook  = SpreadsheetApp.openByUrl('Spreadsheet-URL')
  var sheet = workbook.getSheets()[0];

  //Get the user's responses for the multiple choice and bid price questions 
  var formResponse = e.response.getItemResponses();
  var lotsResponse = formResponse[0].getResponse();
  var bidPrice = formResponse[1].getResponse();

  //Use the selected lot name and find its row in the sheet
  var selectedLotName = lotsResponse.split(', ')[0];
  var textFinder = sheet.getRange(2, 2, sheet.getLastRow()-1, 1).createTextFinder(selectedLotName).matchCase(true).matchEntireCell(true);
  var highestBidCell = textFinder.findNext().offset(0, 3);

  //If the user's bid price is higher that the the current highest bid, update the sheets
  var highestBid = highestBidCell.getValue();
  if(bidPrice > highestBid) {
    highestBidCell.setValue(bidPrice);    


    //Get Sheets info in array and remove header
    var itemsArray = sheet.getDataRange().getValues();
    itemsArray.shift();

    //Get multiple choice question
    var lotsQuestion = formResponse[0].getItem().asMultipleChoiceItem();
    var choicesArray = [];

    //Build choices array from updated sheets info
    for(var i=0; i<itemsArray.length; i++) {
      var lotName = itemsArray[i][1];
      var description = itemsArray[i][2];
      var reservePrice = itemsArray[i][3];
      var highestBid = itemsArray[i][4];

      var choiceString = lotName + ', ' + description + ', ' + reservePrice + ', ' + highestBid;
      var choice = lotsQuestion.createChoice(choiceString);
      choicesArray.push(choice);
    }

    //Set choices array to the multiple choice question, this will only be done when the bid price is higher that the the current highest bid
    lotsQuestion.setChoices(choicesArray);
  }
}

//Creates on form submit trigger
function createOnSubmitTrigger() {
  var form = FormApp.openByUrl('Form-URL');
  ScriptApp.newTrigger('runOnFormSubmit')
  .forForm(form)
  .onFormSubmit()
  .create();
}

Чтобы гарантировать, что скрипт будет запускаться только один раз в одно и то же время, вы можете использовать сервис Lock [6].

[1] https://docs.google.com/forms/d/e/1FAIpQLSfP4skRoqQSY543wE7UbGMLMR7_glIvWpA-hl1k-kufudN64A/viewform?usp=sf_link

[2] https://docs.google.com/spreadsheets/d/1AaGeODbtm4vybQJqdoXL_3zB7hBwIYHZgcwTvtaaXN8/

[3] https://developers.google.com/apps-script/guides/triggers/events

[4] https://developers.google.com/apps-script/reference/forms/form-app

[5] https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

[6] https://developers.google.com/apps-script/reference/lock/lock

...