تبدیل عدد به حروف فارسی در گوگل شیت
آموزش تبدیل عدد به حروف فارسی در گوگل شیت 🔢🔤
یکی از چالشهای رایج در کار با Google Sheets، تبدیل اعداد به معادل حروفی فارسی آنها است. این قابلیت به ویژه برای تهیه فاکتورها، گزارشهای مالی و اسناد رسمی بسیار کاربردی است. در این پست، سه روش متفاوت و کاربردی برای انجام این کار را به شما آموزش میدهیم، از سادهترین تا حرفهایترین روش.
1- سادهترین و سریعترین روش: استفاده از تابع GOOGLETRANSLATE
اگر به دنبال یک راه حل سریع و بدون نیاز به هیچ کدنویسی اضافی هستید، این روش بهترین انتخاب شماست. با استفاده از ترکیب دو تابع داخلی گوگل شیت میتوانید به سادگی هر عددی را به حروف تبدیل کنید.
نحوه کار
تابع BAHTTEXT
در گوگل شیت برای تبدیل اعداد به واحد پولی تایلند استفاده میشود. اما نکته جالب اینجاست که این تابع اعداد را به حروف نیز تبدیل میکند. سپس با استفاده از تابع GOOGLETRANSLATE
، میتوانیم خروجی تایلندی را به فارسی ترجمه کنیم.
فرمول
کافی است در سلول مورد نظر، فرمول زیر را وارد کنید و به جای number
آدرس سلولی که عدد در آن قرار دارد را بگذارید:
=googletranslate(BAHTTEXT(number),"th","fa")
مزایا و معایب
✅ مزایا:
ساده: نیاز به هیچ تنظیمات یا کدنویسی ندارد.
❌ معایب:
محدودیت: فقط اعداد صحیح را پشتیبانی میکند و برای اعداد اعشاری چون از زبان تایلندی استفاده می کند کارایی ندارد.
دقت: در برخی موارد ممکن است ترجمه دقیق نباشد.
۲. روش پیشرفته: استفاده از Google Apps Script
برای تبدیل دقیق و کامل اعداد، از جمله اعداد اعشاری و ارقام بزرگ، میتوانید از Google Apps Script استفاده کنید. این روش به شما اجازه میدهد یک تابع سفارشی با نام دلخواه خود بسازید که همیشه در دسترس شماست.
نحوه راهاندازی
در گوگل شیت خود، به منوی Extensions و سپس Apps Script بروید.
صفحه جدیدی باز میشود. تمام کدهای موجود در آن را حذف کنید.
کد زیر را کپی کرده و در این صفحه جایگذاری کنید.
روی دکمه Run کلیک کنید و سپس مجوزهای لازم را تایید کنید.
کد اسکریپت
/**
* یک عدد را به معادل حروفی فارسی آن (شامل بخش صحیح و اعشار) تبدیل میکند.
*
* @param {number} num عددی که باید به حروف تبدیل شود.
* @return {string} معادل حروفی فارسی عدد.
* @customfunction
* @ساخته شده توسط محمود بنی اسدی
*/
function NUMBERTOTEXTPERSIAN(num) {
if (typeof num !== 'number') {
return "";
}
const sign = num < 0 ? "منفی " : "";
const numAbs = Math.abs(num);
const intPart = Math.floor(numAbs);
// Function equivalent to LAMBDA w in Google Sheets formula - converts a 3-digit number to Persian words.
function convertThreeDigits(x) {
// Ensure the input string is always 3 digits for consistent parsing
const paddedX = String(x).padStart(3, '0');
const h = ["", "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"];
const t = ["", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"];
const o_single = ["", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه"];
const o_teen = ["ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده"];
const h_val = parseInt(paddedX.substring(0, 1));
const t_val = parseInt(paddedX.substring(1, 2));
const o_val = parseInt(paddedX.substring(2, 3));
let hundredWord = h[h_val];
let tenWord = t[t_val];
let oneWord;
if (t_val === 1) { // Numbers 10-19
oneWord = o_teen[o_val];
} else {
oneWord = o_single[o_val];
}
const parts = [];
if (hundredWord) parts.push(hundredWord);
if (tenWord) parts.push(tenWord);
if (oneWord) parts.push(oneWord);
return parts.filter(Boolean).join(" و ").trim();
}
// New helper function to convert a string of digits (up to 6) into Persian words,
// focusing on its direct numerical value without adding large unit names like 'میلیون'.
// This is specifically for the *value* of the decimal part.
function convertDecimalValueToWords(digitsStr) {
const len = digitsStr.length;
if (len === 0 || parseInt(digitsStr) === 0) return "";
// For up to 3 digits (e.g., "5", "54", "123")
if (len <= 3) {
return convertThreeDigits(digitsStr);
}
// For 4 to 6 digits (e.g., "1234", "12345", "123456")
else if (len >= 4 && len <= 6) {
const val = parseInt(digitsStr, 10);
if (val === 0) return "";
// Pad to 6 digits to easily extract thousands and units parts
const sixDigitPadded = String(val).padStart(6, '0');
const parts = [];
const thousandsPart = sixDigitPadded.substring(0, 3); // e.g., for "006548", this is "006"
const unitsPart = sixDigitPadded.substring(3, 6); // e.g., for "006548", this is "548"
if (parseInt(thousandsPart, 10) !== 0) {
parts.push(convertThreeDigits(thousandsPart) + " هزار");
}
if (parseInt(unitsPart, 10) !== 0) {
parts.push(convertThreeDigits(unitsPart));
}
return parts.filter(Boolean).join(" و ");
}
return ""; // Should not reach here for expected inputs
}
// --- Integer Part Conversion ---
// Pad the integer part with leading zeros to 15 digits
const a = String(intPart).padStart(15, '0');
let intText;
if (a === "000000000000000") {
intText = "صفر";
} else {
const intParts = [];
if (a.substring(0, 3) !== "000") intParts.push(convertThreeDigits(a.substring(0, 3)) + " تریلیارد");
if (a.substring(3, 6) !== "000") intParts.push(convertThreeDigits(a.substring(3, 6)) + " میلیارد");
if (a.substring(6, 9) !== "000") intParts.push(convertThreeDigits(a.substring(6, 9)) + " میلیون");
if (a.substring(9, 12) !== "000") intParts.push(convertThreeDigits(a.substring(9, 12)) + " هزار");
if (a.substring(12, 15) !== "000") intParts.push(convertThreeDigits(a.substring(12, 15)));
intText = intParts.filter(Boolean).join(" و ");
}
// --- Decimal Part Conversion ---
const numAbsString = String(numAbs);
let decAll = "";
const decimalIndex = numAbsString.indexOf('.');
if (decimalIndex !== -1) {
decAll = numAbsString.substring(decimalIndex + 1);
}
// Trim trailing zeros from decAll for accurate length calculation
decAll = decAll.replace(/0+$/, '');
let decUsed = "";
let decLen = 0;
if (decAll !== '') { // If there are significant decimal digits
decUsed = decAll.substring(0, 6); // Still limit to 6 digits for conversion
decLen = decUsed.length; // Use the actual length of significant digits
}
let decText = "";
if (decUsed !== "") {
// Check if decimal part is not all zeros
if (parseFloat(decUsed) !== 0) {
let decWords = convertDecimalValueToWords(decUsed); // Use the new helper function
const units = ["دهم", "صدم", "هزارم", "ده هزارم", "صد هزارم", "میلیونم"];
const effectiveDecUnitIndex = decLen - 1; // Direct index based on significant length
if (effectiveDecUnitIndex >= 0 && effectiveDecUnitIndex < units.length) {
const unit = units[effectiveDecUnitIndex];
decText = decWords + " " + unit;
} else {
decText = "اعشار نامعتبر"; // Fallback for unexpected lengths
}
}
}
// --- Final Result Assembly ---
let result;
if (decText !== "") {
if (intText === "صفر" && numAbs < 1) {
result = sign + decText;
} else {
result = sign + intText + " ممیز " + decText;
}
} else {
result = sign + intText;
}
return result.trim();
}
نحوه استفاده
پس از اجرای کد، یک تابع سفارشی با نام NUMBERTOTEXTPERSIAN
به گوگل شیت شما اضافه میشود. اکنون میتوانید در هر سلولی از آن استفاده کنید.
مثال
=NUMBERTOTEXTPERSIAN(A1)
مزایا و معایب
✅ مزایا:
دقیق: تبدیل دقیق اعداد اعشاری و اعداد منفی.
پوشش گسترده: از اعداد بزرگ تا ارقام اعشاری را به درستی تبدیل میکند.
آفلاین: پس از اجرای اولیه، بدون نیاز به اینترنت کار میکند.
❌ معایب:
پیچیدگی: راهاندازی اولیه آن برای کاربران مبتدی کمی دشوار است.
کندی: به دلیل ماهیت اسکریپتنویسی، ممکن است در تبدیل تعداد زیادی عدد، کمی کند عمل کند.
۳. بهترین و بهینهترین روش: استفاده از تابع نامگذاری شده (Named Function)
گوگل شیت قابلیتی به نام تابع نامگذاری شده یا Named Function دارد که به شما اجازه میدهد یک تابع پیشرفته و کارآمد را به طور مستقیم و بدون نیاز به Apps Script در فایل خود ذخیره کنید. این روش بهترین تعادل بین دقت و سرعت را فراهم میکند.
نحوه راهاندازی
شما میتوانید این تابع را به صورت آماده از یک فایل دیگر به فایل خود Import کنید.
فایل گوگل شیت حاوی کد آماده را از این لینک باز کنید: دانلود فایل حاوی فرمول های تبدیل عدد به حروف
در گوگل شیت خود، به منوی Data و سپس Named functions بروید.
روی گزینه Import function کلیک کنید.
فایل گوگل شیت بالا را که قبلاً باز کردهاید، انتخاب کنید.
تابع
ABH
را که نمایش داده میشود، انتخاب کرده و روی Import کلیک کنید.
فرمول تابع نامگذاری شده
=LET(
num,number,
sign,IF(num<0,"منفی ",""),
numAbs,ABS(num),
intPart,INT(numAbs),
decRaw,TEXT(numAbs,"0."&REPT("#",15)),
decAll,IFERROR(index(split(decRaw,"."),2),""),
decUsed,LEFT(decAll,6),
decLen,LEN(decUsed),
a,TEXT(intPart,REPT(0,15)),
w,LAMBDA(x,
LET(
h,CHOOSE(--MID(x,1,1)+1,"","صد","دویست","سیصد","چهارصد","پانصد","ششصد","هفتصد","هشتصد","نهصد"),
t,CHOOSE(--MID(x,2,1)+1,"","","بیست","سی","چهل","پنجاه","شصت","هفتاد","هشتاد","نود"),
o,IF(--MID(x,2,1)<>1,
CHOOSE(--MID(x,3,1)+1,"","یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه"),
CHOOSE(--MID(x,3,1)+1,"ده","یازده","دوازده","سیزده","چهارده","پانزده","شانزده","هفده","هجده","نوزده") ),
TRIM(h & IF(AND(h<>"",OR(t<>"",o<>""))," و ","") & t & IF(AND(t<>"",o<>"")," و ","") & o) ) ),
intText,IF(a=REPT(0,15),"صفر",
TEXTJOIN(" و ",1,
IF(MID(a,1,3)<>"000",w(MID(a,1,3))&" تریلیارد",""),
IF(MID(a,4,3)<>"000",w(MID(a,4,3))&" میلیارد",""),
IF(MID(a,7,3)<>"000",w(MID(a,7,3))&" میلیون",""),
IF(MID(a,10,3)<>"000",w(MID(a,10,3))&" هزار",""),
IF(MID(a,13,3)<>"000",w(MID(a,13,3)),"") ) ),
decText,IF(decUsed="","", IF(VALUE(decUsed)=0,"",
LET(
decPad, TEXT(VALUE(decUsed),"000000"),
decWords, TEXTJOIN(" و ",1,
IF(MID(decPad,1,3)<>"000", w(MID(decPad,1,3)) & " هزار",""),
IF(MID(decPad,4,3)<>"000", w(MID(decPad,4,3)), "") ),
unit,CHOOSE(decLen,"دهم","صدم","هزارم","ده هزارم","صد هزارم","میلیونم"),
decWords & " " & unit ) )),
result, IF(decText<>"", sign & IF(AND(intText="صفر", numAbs<1),
decText,intText & " ممیز " & decText),
sign & intText),
IF(NOT(ISNUMBER(num)),"", result))
نحوه استفاده
پس از Import کردن، میتوانید از تابع ABH
برای تبدیل اعداد در هر سلولی استفاده کنید.
مثال:
=ABH(A1)
مزایا و معایب
✅ مزایا:
- دقت بالا: دقیقترین روش برای تبدیل اعداد اعشاری، منفی و بزرگ.
- سرعت: به دلیل اینکه از توابع بومی گوگل شیت استفاده میکند، بسیار سریعتر از Apps Script عمل میکند.
- قابل حمل: میتوانید این تابع را به راحتی به فایلهای دیگر منتقل کنید.
❌ معایب:
- وابستگی به لینک: برای Import اولیه نیاز به دسترسی به فایل مبدأ دارد.
- پیچیدگی فرمول: برای درک نحوه کار آن، نیاز به آشنایی با توابع پیشرفته گوگل شیت مانند
LET
وLAMBDA
دارید.
جدول مقایسه روشها
ویژگی | روش GOOGLETRANSLATE | روش Apps Script | روش Named Function |
دقت | پایین (فقط اعداد صحیح) | بسیار بالا | بسیار بالا |
سرعت | پایین | پایین | بسیار بالا |
دسترسی | آسان و بومی | نیاز به اسکریپتنویسی | نیاز به Import یکباره |
پشتیبانی از اعشار | ❌ | ✅ | ✅ |
پشتیبانی از منفی | ❌ | ✅ |
شما میتوانید بر اساس نیاز و میزان کاربری خود، بهترین روش را برای تبدیل عدد به حروف در گوگل شیت انتخاب کنید. روش سوم (تابع نامگذاری شده) به دلیل دقت و سرعت بینظیر، بهترین گزینه برای استفاده حرفهای است.
درباره محمود بنی اسدی (مدیر سایت)
فارغ التحصیل کارشناسی ارشد حسابداری، ده سال سابقه تدریس اکسل در سطوح مختلف از قبیل فرمول نویسی، ابزارهای هوش تجاری، ترفندها و ... ، نویسنده شش مقاله در سطح ملی و ISI
نوشتههای بیشتر از محمود بنی اسدی (مدیر سایت)این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید