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

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

У меня также настроена форма Google, которую я хотел бы связать с данными, которые я ввожу на листе лотов. Я хотел бы выполнить итерацию по каждой строке листа лотов и добавить имя лота в столбец 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
Avg 28 Окт 2019 в 00:46
Когда форма запущена, вы не можете взаимодействовать с ней программно, как с HTML-формой.
 – 
Cooper
28 Окт 2019 в 02:15
Могу ли я предложить вам начать с формы Google. Вручную построить простой прототип; выясните, какие данные у вас будут и куда они пойдут. Покажите, где будет отображаться самая высокая ставка. Тогда и только тогда подумайте о том, как обновить данные из электронной таблицы.
 – 
Tedinoz
28 Окт 2019 в 03:43
Я не говорю, что это так просто сделать, но... если бы в OP был триггер OnFormSubmit, который идентифицировал элемент и ставку, не мог бы сценарий обновить соответствующие поля для этого элемента. Затем, когда пользователь в следующий раз откроет форму и выберет тот же элемент, форма будет отражать пересмотренную самую высокую ставку?
 – 
Tedinoz
28 Окт 2019 в 03:51
Да. Мог бы это сделать. Но гарантирует ли это обновление перед следующей отправкой? Я думаю, это зависит от того, насколько быстро они приходят. Должен признаться, что я не так часто использую Google Forms.
 – 
Cooper
28 Окт 2019 в 04:33
"Но гарантирует ли это обновление перед следующей отправкой?" Это "вопрос на 64 доллара", и ответ отрицательный. Как говорит Купер, это зависит от того, насколько быстро поступают заявки. Во всяком случае, вы спросили: «Возможно ли то, что я пытаюсь сделать?» и ответ да. Был ли у вас какой-либо опыт написания кода для Google Forms? Это не так сложно, как только вы освоитесь, но по моему собственному ограниченному опыту может потребоваться некоторое время, чтобы просто освоиться.
 – 
Tedinoz
28 Окт 2019 в 09:17

1 ответ

Я создал пример формы [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();
}

Чтобы гарантировать, что скрипт будет запускаться только один раз одновременно, вы можете использовать службу блокировки [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_3zB7hBwTYHZaXcw8 а>

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

[4] https://developers.google.com/apps-script /ссылка/формы/форма-приложение

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

[6] https://developers.google.com/apps-script/reference /замок/замок

0
Andres Duarte 29 Окт 2019 в 12:02