القائمة الرئيسية

الصفحات

حفظ وأرشفة البيانات باستخدام HTML و JavaScript و Google Sheets

code source google sheets and javascript

 

جوجل شيت (Google Sheets) هي خدمة لإنشاء وتحرير ومشاركة وتخزين البيانات عبر الإنترنت بدون ضياعها ، وهي جزء من مجموعة أدوات جوجل السحابية (Google Workspace) ، ومثلها مثل أي قواعد بيانات أخرى ، وهي مفيدة كثيرا للذين يعملون على الانترنت لأرشفة البيانات وحفظها في مكان آمن مثل الأسماء وأرقام الهاتف وروابط الانترنت وما إلى ذلك .


فوائد تدفعك لاستخدام جوجل شيت :

1- سهولة الاستخدام: يمكن لأي شخص استخدام جوجل شيت بسهولة، وذلك لأنها متاحة عبر الإنترنت ولا تحتاج إلى تثبيت أي برامج على جهاز الكمبيوتر الخاص بك.

2- التعاون والمشاركة: يمكن لأكثر من شخص العمل على ورقة العمل الواحدة في نفس الوقت، ومشاركة البيانات والتعديلات بسهولة ومرونة.

3- التنسيق والتصميم: يتيح لك جوجل شيت إمكانية تنسيق وتصميم ورقة العمل وفقًا لاحتياجاتك، ويمكنك إضافة الرسوم البيانية لتوضيح البيانات.

4- الوصول إلى البيانات من أي مكان: يمكن الوصول إلى ورقة العمل الخاصة بك على جوجل شيت من أي جهاز كمبيوتر أو هاتف ذكي أو جهاز لوحي متصل بالإنترنت أو عبر خدمة api من خلال Google Apps Script .

5- الحفظ التلقائي: يتم حفظ البيانات على جوجل شيت تلقائيًا، وذلك يضمن عدم فقدان البيانات بسبب أي خطأ أو انقطاع في الاتصال بالإنترنت.

6- التكامل مع تطبيقات جوجل الأخرى: يمكنك تكامل جوجل شيت مع تطبيقات جوجل الأخرى مثل جوجل درايف وجوجل فورمز وجوجل كالندر وجوجل سكريبت وغيرها، وذلك يجعل من السهل جداً استخدامها مع تطبيقات أخرى.

7- مجاني وآمن : يمكنك الوصول إلى جوجل شيت فقط من خلال بريد الكتروني جميل ، ولن يصل أحد إلى بياناتك إلا من خلال إعطاء الصلاحيات أو مشاركة البيانات من طرفك.


كيف تنشأ سكريبت لإدخال وتعديل البيانات على Google Sheets من خلال HTML 

باستخدام انشاء سكريبت للتحكم في جدول جوجل شيت لن يتطلب منك الدخول عبر حساب gmail ، فقط كلما فتحت رابط انترنت في اي مكان سواء حاسوب او موبايل ستصل الى بياناتك وتستطيع تعديلها أو حدفها أو أضافة بيانات جديدة .

ستدخل أولا إلى جوجل شيت لإنشاء جدول جديد وتسمية الأعمدة التي ستحتاجها وذلك من خلال الضغط على + بالجانب بالأسفل 






  1. ستغير إسم الملف إلى الإسم الذي تريد في جوجل شيت
  2. هذه تسمى ورقة وهنا يجب إعطاء إسم للورقة
  3. أدخل العناوين كما هي وإذا أردت تنسيقها من خلال أدوات الشريط من الأفضل لتظهر مختلفة على البيانات المدخلة
  4. في الأخير توجه إلى Google Apps Script من خلال الإضافات ثم برمجة التطبيقات Google

في الصورة توجهنا إلى APPS SCRIPT وهنا يمكنك تغيير ملف code.gs لأي إسم تريد ثم قم بنسخ الكود التالي وألصقه بهذا الملف

ولا تنسى تغيير tooroq لإسم الورقة التي وضعته في السابق .

code.gs

function doGet(e) {
    return HtmlService.createHtmlOutputFromFile("index");
  }

function AddRecord(name, email_id , mobile_no, msg_id) {

  var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyyyMMddHHmmss");

  var found_record = false;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheetByName("tooroq");
  var getLastRow = dataSheet.getLastRow();
  for (i = 2; i < getLastRow; i++) {
    if (dataSheet.getRange(i, 1).getValue() == "") {
      dataSheet
        .getRange("A" + i + ":I" + i)
        .setValues([[ formattedDate , name, email_id, mobile_no,msg_id ]]);
      found_record = true;
      break;
    }
  }
  
  if (found_record == false) {
    dataSheet.appendRow([ formattedDate , name, email_id, mobile_no, msg_id]);
  }

  return "SUCCESS";

}


function GetRecords() {
    var return_Array = [];
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var dataSheet = ss.getSheetByName("tooroq");
    var getLastRow = dataSheet.getLastRow();
    for (i = 2; i <= getLastRow; i++) {
      if (dataSheet.getRange(i, 1).getValue() != "") {
        return_Array.push([
          dataSheet.getRange(i, 1).getValue(),
          dataSheet.getRange(i, 2).getValue(),
          dataSheet.getRange(i, 3).getValue(),
          dataSheet.getRange(i, 4).getValue(),
          dataSheet.getRange(i, 5).getValue(),
        ]);
      }
    }
    return return_Array;
  }

function SearchRecords(email_id_search) {
    var returnRows = [];
    var allRecords = GetRecords();
  
    allRecords.forEach(function (value, index) {
      var evalRows = [];
  
      if (email_id_search != "") {
        if (value[3].toUpperCase() == email_id_search.toUpperCase()) {
          evalRows.push("true");
        } else {
          evalRows.push("false");
        }
      } else {
        evalRows.push("true");
      }
  
      if (evalRows.indexOf("false") == -1) {
        returnRows.push(value);
      }
    });
  
    return returnRows;
  }


  function DeleteRecord(record_id) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var dataSheet = ss.getSheetByName("tooroq");
    var getLastRow = dataSheet.getLastRow();
    var table_values = dataSheet.getRange(2, 1, getLastRow - 1, 8).getValues();
    for (i = 0; i < table_values.length; i++) {
      if (table_values[i][0] == record_id) {
        var rowNumber = i + 2;
        dataSheet.getRange("A" + rowNumber + ":I" + rowNumber).clearContent();
      }
    }
    return "SUCCESS";
  }

  function UpdateRecord(record_id, name, email_id , mobile_no, msg_id) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var dataSheet = ss.getSheetByName("tooroq");
    var getLastRow = dataSheet.getLastRow();
    var table_values = dataSheet.getRange(2, 1, getLastRow - 1, 8).getValues();
    for (i = 0; i < table_values.length; i++) {
      if (table_values[i][0] == record_id) {
        dataSheet.getRange(i + 2, 2).setValue(name);
        dataSheet.getRange(i + 2, 3).setValue(email_id);
        dataSheet.getRange(i + 2, 4).setValue(mobile_no);
        dataSheet.getRange(i + 2, 5).setValue(msg_id);
      }
    }
    return "SUCCESS";
  }
  

ثم أنشأ ملف index من خلال الضغط على الزر + الذي يظهر بالصورة قرب code.gs واختار html ثم أنسخ داخله الكود التالي وقد أنشات داخله form من قبل وحطيت فيه attribute و element ضرورية وهي االأكثر استخداما في حفظ البيانات .


index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <script>
          var rnum = "";

        function AddRow() {
            var name = document.getElementById("name").value;
            var mobile_no = document.getElementById("mobile_no").value;
            var email_id = document.getElementById("email_id").value;
            var msg_id = document.getElementById("msg_id").value;

            if (name != '' && mobile_no != '' && email_id != '') {
                google.script.run.withSuccessHandler(function (return_string) {
                    document.getElementById("add_button").disabled = false;
                }).AddRecord(name, email_id , mobile_no, msg_id );
            }
        }

        function UpdateRecord(row_number) {
            var record_id = rnum;
            var name = document.getElementById("name").value;
            var mobile_no = document.getElementById("mobile_no").value;
            var email_id = document.getElementById("email_id").value;
            var msg_id = document.getElementById("msg_id").value;

            google.script.run.withSuccessHandler(function (return_string) {
 
            }).UpdateRecord(record_id, name, email_id , mobile_no, msg_id);
        }

        function EditRecord(row_number) {

            var record_id = document.getElementById("up_record_id" + row_number).value;
            var node_name = document.getElementById("up_name" + row_number);
            var node_mobile = document.getElementById("up_mobile_no" + row_number);
            var node_email = document.getElementById("up_email_id" + row_number);
            var node_msg_id = document.getElementById("up_msg_id" + row_number);

            var name_text = node_name.textContent || node_name.innerText;
            var mobile_text = node_mobile.textContent || node_mobile.innerText;
            var email_text = node_email.textContent || node_email.innerText;
            var msg_text = node_msg_id.textContent || node_msg_id.innerText;

            document.getElementById("name").value = name_text;
            document.getElementById("mobile_no").value = mobile_text;
            document.getElementById("email_id").value = email_text;
            document.getElementById("msg_id").value = msg_text ;

            rnum = record_id;


        }

        function DeleteRecord(row_number) {

            var record_id = document.getElementById("up_record_id" + row_number).value;

            google.script.run.withSuccessHandler(function (return_string) {
                if (return_string == 'SUCCESS') {
                    document.getElementById("up_record_id" + row_number).remove();
                    document.getElementById("up_name" + row_number).remove();
                    document.getElementById("up_mobile_no" + row_number).remove();
                    document.getElementById("up_email_id" + row_number).remove();
                    document.getElementById("up_msg_id" + row_number).remove();
                    document.getElementById("up_update" + row_number).remove();
                    document.getElementById("up_update" + row_number).remove();
                }
            }).DeleteRecord(record_id);
        }


        function SearchRecords() {
            var name = document.getElementById("name").value;
            var mobile_no = document.getElementById("mobile_no").value;
            var email_id = document.getElementById("email_id").value;
            var msg_id = document.getElementById("msg_id").value;
            var email_id_search = document.getElementById("email_id_search").value;
            var row_number = 0;

            google.script.run.withSuccessHandler(function (ar) {

                console.log(ar);
                var displayTable = '<div class=\"grid grid-cols-5 gap-5\">';
                displayTable += "<div><b>Name And Email</b></b></div>";
                displayTable += "<div><b>Mobile</b></div>";
                displayTable += "<div><b>Msg</b></div>";
                displayTable += "<div><b>Update</b></div>";
                displayTable += "<div><b>Delete</b></div>";
                displayTable += "</div><br>";
                displayTable += "<div class=\"grid grid-cols-5 gap-5\">";

                ar.forEach(function (item, index) {

                    displayTable += "<input type=\"hidden\" id=\"up_record_id" + row_number + "\" value=\"" + item[0] + "\" />";

                    displayTable += "<div> <p id=\"up_name" + row_number + "\">";
                    displayTable += item[1]
                   
                    displayTable += "</p> <p id=\"up_email_id" + row_number + "\" > ";
                    displayTable += item[2]
                    displayTable += "</p> </div>"


                    displayTable += "<div id=\"up_mobile_no" + row_number + "\">";
                    displayTable += item[3]
                    displayTable += "</div>"

                    displayTable += "<div id=\"up_msg_id" + row_number + "\">";
                    displayTable += item[4]
                    displayTable += "</div>"

                    displayTable += "<div id=\"up_update" + row_number + "\" onclick=\"EditRecord(" + row_number + ")\" class=\"text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto max-w-[120px] px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800\">";
                    displayTable += "Edit"
                    displayTable += "</div>"

                    displayTable += "<div id=\"up_update" + row_number + "\"  onclick=\"DeleteRecord(" + row_number + ")\"  class=\"text-white bg-red-700 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 max-w-[120px] py-2.5 text-center dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-800\">";
                    displayTable += "Delete"
                    displayTable += "</div>"

                    row_number++;
                });

                displayTable += '</div>';
                document.getElementById("rowdata").innerHTML = displayTable;

            }).SearchRecords(email_id_search);

        }

    </script>


    <div class="block p-6 rounded-lg shadow-lg bg-white mx-8 my-8">
        <form id="signupForm">
            <div class="grid grid-cols-3 gap-4">
                <div class="relative z-0 w-full mb-6 group">
                    <input type="text" name="name" id="name"
                        class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer"
                        placeholder=" " required />
                    <label
                        class="peer-focus:font-medium absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">
                        Name
                    </label>
                </div>
                <div class="relative z-0 w-full mb-6 group">
                    <input type="text" name="mobile_no" id="mobile_no"
                        class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer"
                        placeholder=" " required />
                    <label
                        class="peer-focus:font-medium absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">
                        Mobile
                    </label>
                </div>
                <div class="relative z-0 w-full mb-6 group">
                    <input type="text" name="email_id" id="email_id"
                        class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer"
                        placeholder=" " required />
                    <label
                        class="peer-focus:font-medium absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">
                        Email
                    </label>
                </div>
            </div>


            <div class="grid grid-cols-3 gap-4">
                <div class="relative z-0 w-full mb-6 group">
                    <textarea rows="4" cols="50" type="textarea" name="msg_id" id="msg_id"
                        class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer"
                        placeholder=" " required ></textarea>
                    <label
                        class="peer-focus:font-medium absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">
                        Message
                    </label>

                </div>
            </div>



            <div class="grid grid-cols-8 gap-4">
                <button type="submit"
                    class="text-white bg-green-700 hover:bg-green-800 focus:ring-4 focus:outline-none focus:ring-green-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-green-600 dark:hover:bg-green-700 dark:focus:ring-green-800"
                    onclick="AddRow()" id="add_button">Save</button>
                <button type="button"
                    class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
                    onclick="UpdateRecord()" id="update_button">Update</button>
                <button type="reset"
                    class="text-white bg-orange-700 hover:bg-orange-800 focus:ring-4 focus:outline-none focus:ring-orange-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-orange-600 dark:hover:bg-orange-700 dark:focus:ring-orange-800">Clear</button>
            </div>

        </form>
    </div>

    <div class="block p-6 rounded-lg shadow-lg bg-white mx-8 my-8">
        <div class="grid grid-cols-2 gap-4">
            <div class="relative z-0 w-full mb-6 group">
                <input type="email" id="email_id_search"
                    class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer"
                    placeholder=" " required />
                <label for="floating_email"
                    class="peer-focus:font-medium absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Email
                    ID</label>

            </div>
            <span class="">
                <button type="button"
                    class="text-white bg-blue-700 hover:bg-blue-800 max-w-[450px] focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
                    onclick="SearchRecords()">Search</button>
            </span>
        </div>
        <div id="rowdata"></div>
    </div>

</body>

</html>


لا تنسى الضغط على علامة حفظ التي بجانب تنفيذ ضمن شريط الأدوات وبعد ذلك توجه إلى نشر واضغط على الخيار الأول نشر جديد

وستظهر لك مثل ما في الصورة تختار كما اخترنا نحن 


في الخيار الرابع أكتب أسم الاصدار للسكريبت مثل ضع version 1.0 ثم اتبع الصور بعد الضغط على نشر ثم قم بتفويض الوصل إلى جوجل شيت باتباع الصور








هذا الرابط هو الذي يجب عليك أن تحتفظ به وتستخدمه عند إدخال البيانات من خلال الأدوات التالية التي أنشأناها من قبل على index.html 

مثل هذه السكربتات قد تجدها تباع على مواقع عديدة وهي بصراحة جيدة لتخزين البيانات المهمة ورابط الانرنتن او ارقام الهاتف او حفظ الملاحظات وطبعا يمكنك الوصول إليها من خلال الهاتف او الحاسوب وفي أي مكان أردت وبدون تسجيل الدخول على Gmail .


في حالة لم تفهم أكثر من خلال الشرح بالصور يمكنك مشاهدة الفيديو لتستطيع انشاء سكريبت متكامل لحفظ وارشفة بياناتك 



تحميـــل كود سورس

معاينـــة


هل اعجبك الموضوع :

تعليقات



التنقل السريع