إنشاء خريطة حرارية لبيانات جدول البيانات باستخدام ماكرو ONLYOFFICE
في تحليل البيانات، يعد التعرف على الاختلافات في القيم الرقمية بنظرة سريعة أمرًا بالغ الأهمية لاتخاذ القرار. يمكن أن يكون تنسيق كل خلية يدويًا مستهلكًا للوقت وعرضة للأخطاء. يحل ماكرو ONLYOFFICE هذا المشكلة عن طريق ضبط ألوان الخلايا ديناميكيًا، مما يسهل تفسير البيانات المعقدة بكفاءة.
بناء الماكرو
var sheet = Api.GetActiveSheet();
var range = sheet.GetSelection();
var data = range.GetValue();
في البداية، نقوم بتهيئة الورقة النشطة والتحديد والنطاق داخل المتغيرات sheet و range و data على التوالي.
معالجة خطأ “لم يتم تحديد بيانات”
مباشرة بعد ذلك، نتحقق مما إذا كانت هناك أي بيانات محددة بالفعل. إذا لم يتم تحديد أي بيانات، فإننا ننهي وظيفة الماكرو برسالة مناسبة: “لم يتم تحديد بيانات.”
//We check if no data is selected, and show message if that is the case
if (!data) {
console.log("No data selected");
return;
}
استخراج مؤشرات الصفوف والأعمدة من التحديد
إذا كانت البيانات موجودة، نتابع باسترداد معلماتها — مؤشرات بداية العمود ونهاية العمود وبداية الصف ونهاية الصف.
//Indexes indicating where rows and columns start and end
var firstRowIndex = range.GetCells().Row;
var firstColIndex = range.GetCells().Col;
var lastRowIndex = data.length + firstRowIndex;
var lastColIndex = data[0].length + firstColIndex;
هناك طرق عديدة يمكننا من خلالها الحصول على المؤشرات، ولكن إحداها موضحة في مقتطف الشفرة أعلاه:
- range.GetCells() – نصل إلى خلايا التحديد الخاص بنا، وبإلحاق .Row() أو .Col()، نحصل على مؤشر الصف الأول والعمود الأول.
- بمجرد حصولنا على ذلك، يمكننا استخدام data.length، والذي سيعطينا عدد الصفوف في بياناتنا. ثم نضيف هذا إلى المتغير firstRowIndex للحصول على مؤشر الصف الأخير. نفعل الشيء نفسه بالنسبة للأعمدة، باستخدام data[0].length للحصول على عدد الأعمدة، ثم نضيف المتغير firstColIndex.
لماذا data[0]? نظرًا لأننا لا نعرف عدد الصفوف التي لدينا، وكل من data[0] و data[1] وما إلى ذلك يمثل صفًا، فإن الشيء الوحيد الذي يمكننا التأكد منه هو أن بياناتنا ستحتوي دائمًا على صف واحد على الأقل. هذا يعني أن data[0] ستكون دائمًا صالحة إذا كان المتغير data يحتوي على أي قيم.
جمع الأرقام من خلايا جدول البيانات المحددة
بعد ذلك، نقوم بإنشاء مصفوفة values ونملأها بالأرقام من التحديد الخاص بنا.
var values = []; //We will store number from selected data here
for (var i = firstColIndex; i < lastColIndex; i++) {
for (var j = firstRowIndex; j < lastRowIndex; j++) {
//We are checking if the value is a number
//If it is, we store it to values array
if (!isNaN(parseFloat(sheet.GetCells(j, i).GetValue()))) {
var value = parseFloat(sheet.GetCells(j, i).GetValue());
values.push(sheet.GetCells(j, i).GetValue());
}
}
}
بعد تهيئة مصفوفة values، نكرر عبر كل خلية في تحديدنا. افتراضيًا، يتم التعامل مع القيمة في كل خلية كسلسلة نصية، لذلك عندما نتحقق مما إذا كانت القيمة رقمًا، نحتاج أولاً إلى استخدام طريقة parseFloat() لتحويلها إلى رقم. إذا كانت السلسلة النصية داخل الخلية تمثل رقمًا، فإن parseFloat ستحولها إلى رقم. إذا لم تكن كذلك، فستحولها إلى NaN (ليس رقمًا). تتحقق الدالة isNaN(…) مما إذا كانت القيمة داخل الأقواس ليست رقمًا. إذا أضفنا علامة “!” قبل isNaN(…)، فإننا نتحقق مما إذا كانت القيمة رقمًا. إذا كانت القيمة رقمًا، نقوم بتهيئة المتغير value وتخزين الرقم فيه. ثم نلحق هذه القيمة بمصفوفة values. بعد التكرار، نحصل على مصفوفة values، التي تحتوي على جميع الأرقام من الخلايا المحددة. السبب الذي نحتاج من أجله إلى هذه المصفوفة هو حتى نتمكن من العثور على الحد الأدنى والحد الأقصى للأرقام من الخلايا المحددة باستخدام طريقتي JavaScript وهما Math.min() و Math.max().
العثور على الحد الأدنى والحد الأقصى للقيمة
//Storing minimum and maximum values from the values array
var minValue = Math.min(...values);
var maxValue = Math.max(...values);
تطبيق الألوان
الآن بعد أن أصبح لدينا كل المعلومات الضرورية، يمكننا تطبيق ألوان مخصصة على الخلايا التي تحتوي على أرقام. لدينا كل من الحد الأدنى والحد الأقصى للأرقام من الخلايا المحددة، لذا يمكننا التكرار عبر الخلايا مرة أخرى.
for (var i = firstColIndex; i < lastColIndex; i++) {
for (var j = firstRowIndex; j < lastRowIndex; j++) {
//Again we have to check if the value is a number
//If it is, we create the color depending on that value
//As well as minimum and maximum value from the array
if (!isNaN(parseFloat(sheet.GetCells(j, i).GetValue()))) {
var value = parseFloat(sheet.GetCells(j, i).GetValue());
var ratio = (value - minValue) / (maxValue - minValue);
var red = Math.round(255 * ratio);
var green = Math.round(255 * (1 - ratio));
sheet
.GetCells(j, i)
.SetFillColor(Api.CreateColorFromRGB(red, green, 0));
//We want colors to go from green to red
}
}
}
عند إنشاء لون باستخدام نظام RGB، نحتاج إلى معلمات الأحمر والأخضر والأزرق لإنشاء أي لون مرغوب. في هذه الحالة، يجب أن يتراوح اللون من الأخضر إلى الأحمر، مما يعني أن معلمة الأزرق تظل عند 0 بينما تختلف معلمات الأحمر والأخضر اعتمادًا على الظل المطلوب. إذا كان الرقم صغيرًا — أقرب إلى القيمة الدنيا — فسيكون اللون أكثر اخضرارًا (القيمة الدنيا تتوافق مع الأخضر النقي). على العكس، إذا كان الرقم كبيرًا، فسوف يتحول اللون نحو الأحمر (القيمة القصوى تتوافق مع الأحمر النقي). لتحديد مدى كبر أو صغر الرقم، نستخدم طريقة تسوية الحد الأدنى والحد الأقصى (Min-Max Normalization) للحصول على “نسبة” بين 0 و 1. ينتج عن الرقم الأكبر نسبة أقرب إلى 1، بينما ينتج عن الرقم الأصغر نسبة أقرب إلى 0. يتم حساب هذه النسبة باستخدام المتغيرين minValue و maxValue. يمكننا بعد ذلك استخدام هذه النسبة لتحديد معلمات الأحمر والأخضر. على عكس النسبة التي تتراوح من 0 إلى 1، فإن قيمتي الأحمر والأخضر تتدرجان من 0 إلى 255، لذلك نضرب النسبة وفقًا لذلك. نظرًا لأن اللون الأحمر يجب أن يكون أكثر هيمنة للأرقام الأكبر، فإننا نحسبه بضرب النسبة في 255 وتقريبها إلى أقرب عدد صحيح. بالنسبة للأخضر، يكون الحساب مختلفًا. يجب أن يكون اللون الأخضر أكثر هيمنة للأرقام الأصغر، لذلك نستخدم 1−textratio، ونضربها في 255. عندما يكون الرقم أكبر، تقترب النسبة من 1، مما يجعل 1−textratio أصغر، وهذا بدوره يقلل من قيمة الأخضر. بمجرد الحصول على معلمات الأحمر والأخضر، نستخدم Api.CreateColorFromRGB(r, g, b) لإنشاء اللون و .SetFillColor(color) لتطبيقه على الخلية.
كود الماكرو الكامل
(function () {
var sheet = Api.GetActiveSheet();
var range = sheet.GetSelection();
var data = range.GetValue();
//We check if no data is selected, and show message if that is the case
if (!data) {
console.log("No data selected");
return;
}
//Indexes indicating where rows and columns start and end
var firstRowIndex = range.GetCells().Row;
var firstColIndex = range.GetCells().Col;
var lastRowIndex = data.length + firstRowIndex;
var lastColIndex = data[0].length + firstColIndex;
console.log(firstColIndex + " " + lastColIndex); //Testing if we got the right column indexes, first should be on spot, last should be higher by 1
console.log(firstRowIndex + " " + lastRowIndex); //Testing if we got the right row indexes, first should be on spot, last should be higher by 1
var values = []; //We will store number from selected data here
for (var i = firstColIndex; i < lastColIndex; i++) {
for (var j = firstRowIndex; j < lastRowIndex; j++) {
//We are checking if the value is a number
//If it is, we store it to values array
if (!isNaN(parseFloat(sheet.GetCells(j, i).GetValue()))) {
var value = parseFloat(sheet.GetCells(j, i).GetValue());
values.push(sheet.GetCells(j, i).GetValue());
}
}
}
//Storing minimum and maximum values from the values array
var minValue = Math.min(...values);
var maxValue = Math.max(...values);
for (var i = firstColIndex; i < lastColIndex; i++) {
for (var j = firstRowIndex; j < lastRowIndex; j++) {
//Again we have to check if the value is a number
//If it is, we create the color depending on that value
//As well as minimum and maximum value from the array
if (!isNaN(parseFloat(sheet.GetCells(j, i).GetValue()))) {
var value = parseFloat(sheet.GetCells(j, i).GetValue());
var ratio = (value - minValue) / (maxValue - minValue);
var red = Math.round(255 * ratio);
var green = Math.round(255 * (1 - ratio));
sheet
.GetCells(j, i)
.SetFillColor(Api.CreateColorFromRGB(red, green, 0));
//We want colors to go from green to red
}
}
}
})();
دعونا نشغل الماكرو ونرى كيف يعمل! قبل تشغيل الماكرو:
بعد تشغيل الماكرو:
الآن يمكنكم تصور توزيع البيانات بسهولة في جدول البيانات الخاص بكم، مما يجعل التحليل أكثر سهولة. سواء كنتم تعملون على إصدار الحاسوب أو الويب من ONLYOFFICE، يندمج هذا الماكرو بسلاسة في سير عملكم. لا تفوتوا فرصة استكشاف الإمكانات الكاملة لواجهة برمجة تطبيقات ONLYOFFICE API. مع مجموعة واسعة من الطرق، يمكنكم تحويل أفكاركم في الأتمتة إلى حقيقة. إذا كانت لديكم أي أسئلة أو مفاهيم مبتكرة، فلا تترددوا في مشاركتها معنا. نحن نقدر مدخلاتكم ونتطلع إلى التعاون معكم. حظا سعيدا في مساعيكم الاستكشافية!
عن الكاتب
ONLYOFFICE ١. أنشئ حسابك المجاني من
،٢. قم بعرض و تحرير أو التعاون على المستندات، الجداول ، العروض التقديمية