Google Sheets - sebagai asisten serbaguna untuk tugas-tugas rumit atau cara saya membuat penganalisis sepak bola

Saya berbaring di malam hari, mencoba untuk tidur. Dan seperti biasa seribu pikiran, dan di antaranya saya berhasil menangkap satu. Dan itu terdengar seperti ini: "mengapa tidak membuat penganalisis pertandingan sepak bola, di mana Anda hanya perlu memasukkan peserta dalam permainan dan mendapatkan contoh statistik umum mereka dan beberapa deskripsi tentang apa yang diharapkan dalam pertandingan mendatang." Memang kenapa tidak ?!





Keesokan harinya, ketika saya bangun, hal pertama yang saya lakukan adalah google, apakah ada hal seperti itu sekarang, karena sesuatu menyarankan bahwa di dunia kita ini adalah ide yang terlalu dangkal (oke!?). Tetapi saya tidak hanya ingin menambah dan membagi angka dari statistik, saya ingin mempertimbangkan berbagai faktor dari sebuah acara olahraga, tetapi jumlahnya banyak.





Namun, Google memberikan hasilnya, seperti biasa. Saya menemukan banyak kalkulator tarif yang dijual seharga 3-5 ribu rubel, dan tabel kalkulasi lainnya di domain publik. Saya agak ingat kalkulasi total gol, tapi saya perlu memperbaikinya dan mendapatkan "pesulap / ahli sihir / wangoo" dari acara olahraga secara keseluruhan. Atau setidaknya rumus yang akan mengembalikan hasil setelah memasukkan data.





Apakah tulisan ini parser?!

Saya tidak ingin mendalami kodenya. Pertama, saya bukan seorang pembuat kode, melainkan orang yang terus-menerus bertemu dengannya dalam pekerjaannya, dan dapat sedikit memahaminya. Kedua, saya terlalu malas, saya mencari solusi sederhana. Dan saya ingat bahwa keajaiban Google Sheets dapat mengurai tabel, xml, halaman html, dan ini dilakukan dengan rumus sederhana: IMPORTDATA, IMPORTFEED, IMPORTHTML, IMPORTXML. Ini tautan ke bantuan Google, semuanya dijelaskan secara detail di sana, saya mungkin tidak akan membahas ini.





, . , , , . fbref.com, 2002 . " , !", - , 3- . , XG, XGa "". API Google Sheets query , sql, , , .





, Google Sheets ?!

, , . , , . , , . . , , Wordpress, , -, , . , , . Inline Google Spreadsheet Viewer. , , :





, Google Sheets?

. , , , . =). , . : , ( , ), , Google Sheets API. .





. " html , Google Apps". 999 , , , .





, , Google Sheets, - . , , . . , , , .





. , , , . , . Google Apps Script .





/******************************************************************************
 * This tutorial is based on the work of Martin Hawksey twitter.com/mhawksey  *
 * But has been simplified and cleaned up to make it more beginner friendly   *
 * All credit still goes to Martin and any issues/complaints/questions to me. *
 ******************************************************************************/

// if you want to store your email server-side (hidden), uncomment the next line
// var TO_ADDRESS = "example@email.net";

// spit out all the keys/values from the form in HTML for email
// uses an array of keys if provided or the object to determine field order
function formatMailBody(obj, order) {
  var result = "";
  if (!order) {
    order = Object.keys(obj);
  }
  
  // loop over all keys in the ordered form data
  for (var idx in order) {
    var key = order[idx];
    result += "<h4 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h4><div>" + sanitizeInput(obj[key]) + "</div>";
    // for every key, concatenate an `<h4 />`/`<div />` pairing of the key name and its value, 
    // and append it to the `result` string created at the start.
  }
  return result; // once the looping is done, `result` will be one long string to put in the email body
}

// sanitize content from the user - trust no one 
// ref: https://developers.google.com/apps-script/reference/html/html-output#appendUntrusted(String)
function sanitizeInput(rawInput) {
   var placeholder = HtmlService.createHtmlOutput(" ");
   placeholder.appendUntrusted(rawInput);
  
   return placeholder.getContent();
 }

function doPost(e) {

  try {
    Logger.log(e); // the Google Script version of console.log see: Class Logger
    record_data(e);
    
    // shorter name for form data
    var mailData = e.parameters;

    // names and order of form elements (if set)
    var orderParameter = e.parameters.formDataNameOrder;
    var dataOrder;
    if (orderParameter) {
      dataOrder = JSON.parse(orderParameter);
    }
    
    // determine recepient of the email
    // if you have your email uncommented above, it uses that `TO_ADDRESS`
    // otherwise, it defaults to the email provided by the form's data attribute
    var sendEmailTo = (typeof TO_ADDRESS !== "undefined") ? TO_ADDRESS : mailData.formGoogleSendEmail;
    
    // send email if to address is set
    if (sendEmailTo) {
      MailApp.sendEmail({
        to: String(sendEmailTo),
        subject: "Contact form submitted",
        // replyTo: String(mailData.email), // This is optional and reliant on your form actually collecting a field named `email`
        htmlBody: formatMailBody(mailData, dataOrder)
      });
    }

    return ContentService    // return json success results
          .createTextOutput(
            JSON.stringify({"result":"success",
                            "data": JSON.stringify(e.parameters) }))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(error) { // if error return this
    Logger.log(error);
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": error}))
          .setMimeType(ContentService.MimeType.JSON);
  }
}


/**
 * record_data inserts the data received from the html form submission
 * e is the data received from the POST
 */
function record_data(e) {
  var lock = LockService.getDocumentLock();
  lock.waitLock(30000); // hold off up to 30 sec to avoid concurrent writing
  
  try {
    Logger.log(JSON.stringify(e)); // log the POST data in case we need to debug it
    
    // select the 'responses' sheet by default
    var doc = SpreadsheetApp.getActiveSpreadsheet();
    var sheetName = e.parameters.formGoogleSheetName || "responses";
    var sheet = doc.getSheetByName(sheetName);
    
    var oldHeader = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var newHeader = oldHeader.slice();
    var fieldsFromForm = getDataColumns(e.parameters);
    var row = [new Date()]; // first element in the row should always be a timestamp
    
    // loop through the header columns
    for (var i = 1; i < oldHeader.length; i++) { // start at 1 to avoid Timestamp column
      var field = oldHeader[i];
      var output = getFieldFromData(field, e.parameters);
      row.push(output);
      
      // mark as stored by removing from form fields
      var formIndex = fieldsFromForm.indexOf(field);
      if (formIndex > -1) {
        fieldsFromForm.splice(formIndex, 1);
      }
    }
    
    // set any new fields in our form
    for (var i = 0; i < fieldsFromForm.length; i++) {
      var field = fieldsFromForm[i];
      var output = getFieldFromData(field, e.parameters);
      row.push(output);
      newHeader.push(field);
    }
    
    // more efficient to set values as [][] array than individually
    var nextRow = sheet.getLastRow() + 1; // get next row
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);

    // update header row with any new data
    if (newHeader.length > oldHeader.length) {
      sheet.getRange(1, 1, 1, newHeader.length).setValues([newHeader]);
    }
  }
  catch(error) {
    Logger.log(error);
  }
  finally {
    lock.releaseLock();
    return;
  }

}

function getDataColumns(data) {
  return Object.keys(data).filter(function(column) {
    return !(column === 'formDataNameOrder' || column === 'formGoogleSheetName' || column === 'formGoogleSendEmail' || column === 'honeypot');
  });
}

function getFieldFromData(field, data) {
  var values = data[field] || '';
  var output = values.join ? values.join(', ') : values;
  return output;
}
      
      



, , . ?





, , , . .





function update() { 
  var sheetName1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tournament"); 
  var sheetName2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TheMeets"); 
  var sheetName3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TheMeets_sort"); 
  var cellFunction1 = '=IMPORTHTML("https://fbref.com/en/comps/12/La-Liga-Stats","table",1)';
  var cellFunction2 = '=sort({IMPORTHTML("https://fbref.com/en/comps/12/schedule/La-Liga-Scores-and-Fixtures","table",1);IMPORTHTML("https://fbref.com/en/comps/12/3239/schedule/2019-2020-La-Liga-Scores-and-Fixtures","table",1);IMPORTHTML("https://fbref.com/en/comps/12/1886/schedule/2018-2019-La-Liga-Scores-and-Fixtures","table",1);IMPORTHTML("https://fbref.com/en/comps/12/1652/schedule/2017-2018-La-Liga-Scores-and-Fixtures","table",1)},3,FALSE)';
  var cellFunction3 = '=sort(IMPORTHTML("https://fbref.com/en/comps/12/schedule/La-Liga-Scores-and-Fixtures","table",1),3,TRUE)';
  
    sheetName1.getRange('A1').setValue(cellFunction1); 
    sheetName2.getRange('A2').setValue(cellFunction2);
    sheetName3.getRange('A1').setValue(cellFunction3);
}
      
      



. Google Apps Script , . !





!

, :





" " "", , Google Sheets , , . , -.





Saya berharap pekerjaan saya tidak selesai dengan sia-sia, dan di dunia berbahasa Rusia, artikel ini akan menyelamatkan beberapa nyawa lagi dari ide-ide yang menggoda dan memakan Anda dari dalam.





Semua kode, petunjuk, dan cara menggunakan Google Apps Script untuk menyimpan data Anda di Google Spreadsheet di sini .





Singkatnya, saya menulis di sports.ru apa yang saya rencanakan untuk diperhitungkan dalam perhitungan dan cara menghitung .








All Articles