قیمت لحظه ای طلا در اکسل و گوگل شیت؛ اتصال به API بدون برنامهنویسی پیچیده
قیمت لحظه ای طلا در اکسل و گوگل شیت: اتصال با Power Query در اکسل و Apps Script در گوگل شیت، تابع سفارشی =EZRATE("g18")، بهروزرسانی خودکار و نگهداری امن کلید API.

- در گوگل شیت با یک تابع سفارشی Apps Script میتوانید در هر خانه بنویسید =EZRATE("g18") و قیمت طلای ۱۸ را بگیرید.
- در اکسل، Power Query با Web.Contents و هدر X-API-Key جدول نرخها را میسازد و با Refresh All تازه میشود.
- کلید را در Script Properties یا پارامتر Power Query نگه دارید و فایل حاوی کلید را با دیگران به اشتراک نگذارید.
حسابداران، کارشناسان بازرگانی و طلافروشانی که محاسباتشان در اکسل است، معمولاً هر صبح نرخ دلار و طلا را از یک سایت کپی و در فایل خود وارد میکنند. این کار هم وقت میگیرد و هم خطای تایپی میسازد. در این آموزش قیمت لحظه ای طلا در اکسل و گوگل شیت را مستقیم از API میخوانیم؛ بدون نیاز به دانش برنامهنویسی جدی.
=EZRATE("usd") یا =EZRATE("g18";"buy") بنویسید. در اکسل: «Data › Get Data › From Web» را با هدر X-API-Key و آدرس https://api.ezrate.me/v1/rates?symbols=usd,g18,emami بسازید.این آموزش بخشی از راهنمای کامل API قیمت ارز و طلا است.
چرا IMPORTDATA و IMPORTXML کافی نیست؟
گوگل شیت تابعهایی مثل IMPORTDATA و IMPORTXML دارد که داده را از یک آدرس میخوانند. اما این تابعها نمیتوانند هدر سفارشی (مثل کلید API) بفرستند و برداشت HTML سایتهای دیگر هم همان مشکلات اسکرپینگ را دارد (اسکرپ سایت قیمت یا API). راه درست، یک تابع سفارشی کوچک با Apps Script است.
گوگل شیت: تابع سفارشی =EZRATE()
- فایل گوگل شیت را باز کنید و از منوی Extensions گزینهٔ Apps Script را بزنید.
- کد زیر را جایگزین کد پیشفرض کنید و ذخیره کنید.
- از منوی Project Settings (چرخدنده) در بخش Script Properties یک ویژگی با نام
EZRATE_KEYو مقدار کلید خود بسازید. - به شیت برگردید و در یک خانه بنویسید
=EZRATE("usd"). بار اول گوگل اجازهٔ دسترسی به اینترنت را میپرسد.
/**
* قیمت لحظهای از EZRate.
* @param {string} symbol نماد: usd, eur, g18, emami, usdt…
* @param {string} side "sell" (پیشفرض) یا "buy"
* @customfunction
*/
function EZRATE(symbol, side) {
side = side || "sell"
const rates = ezrateAll_()
const r = rates[String(symbol).toLowerCase()]
if (!r) throw new Error("نماد ناشناخته: " + symbol)
return r[side]
}
/** همهٔ نرخها، با کش ۵ دقیقهای تا هر خانه درخواست جدا نسازد */
function ezrateAll_() {
const cache = CacheService.getScriptCache()
const hit = cache.get("ezrate_all")
if (hit) return JSON.parse(hit)
const key = PropertiesService.getScriptProperties().getProperty("EZRATE_KEY")
const res = UrlFetchApp.fetch("https://api.ezrate.me/v1/rates?symbols=usd,eur,aed,try,usdt,g18,g24,mesghal,ounce,emami,bahar,nim,rob,gerami", {
headers: { "X-API-Key": key }, muteHttpExceptions: true })
if (res.getResponseCode() !== 200) throw new Error("EZRate: HTTP " + res.getResponseCode())
const map = {}
JSON.parse(res.getContentText()).data.forEach(x => (map[x.symbol] = { buy: x.buy, sell: x.sell, at: x.updated_at }))
cache.put("ezrate_all", JSON.stringify(map), 300)
return map
}نکتهٔ مهم کد: همهٔ نرخها با یک درخواست گرفته و ۵ دقیقه کش میشوند. اگر ۲۰۰ خانه از =EZRATE() استفاده کنند، باز هم فقط یک درخواست ارسال میشود.
بهروزرسانی خودکار
تابعهای سفارشی گوگل شیت فقط وقتی دوباره محاسبه میشوند که ورودیشان تغییر کند. برای تازه شدن دورهای، از Triggers در Apps Script یک تریگر زمانی (هر ۱۵ دقیقه) بسازید که یک خانهٔ کمکی را عوض کند، یا سادهتر: در ورودی تابع از یک خانه که زمان فعلی را دارد استفاده کنید. برای بیشتر کاربردهای حسابداری، تازه شدن هنگام باز کردن فایل کافی است.
اکسل: Power Query
در اکسل ۲۰۱۶ به بعد و Microsoft 365، Power Query میتواند هر API با خروجی JSON را بخواند:
- از تب Data گزینهٔ Get Data › From Other Sources › Blank Query را بزنید.
- در Power Query Editor از تب Home گزینهٔ Advanced Editor را باز کنید و کد زیر را بچسبانید.
- کلید خود را بهجای
YOUR_KEYبنویسید (یا آن را به یک پارامتر Power Query تبدیل کنید). - Close & Load را بزنید؛ جدول نرخها در یک شیت جدید ساخته میشود.
let
Source = Json.Document(Web.Contents("https://api.ezrate.me/v1/rates",
[Query = [symbols = "usd,eur,aed,g18,mesghal,emami,bahar,usdt", lang = "fa"],
Headers = [#"X-API-Key" = "YOUR_KEY"]])),
Data = Source[data],
Table = Table.FromList(Data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
Expanded = Table.ExpandRecordColumn(Table, "Column1",
{"symbol", "name", "buy", "sell", "change_pct", "updated_at"}),
Typed = Table.TransformColumnTypes(Expanded,
{{"buy", Int64.Type}, {"sell", Int64.Type}, {"change_pct", type number}})
in
Typedبرای تازه کردن، Data › Refresh All را بزنید یا از Query Properties گزینهٔ «Refresh every 15 minutes» و «Refresh data when opening the file» را فعال کنید. حالا در فرمولهای خود با VLOOKUP یا XLOOKUP قیمت هر نماد را از این جدول بردارید؛ مثلاً =XLOOKUP("g18";Table1[symbol];Table1[sell]).
نمونهٔ کاربردی: محاسبهٔ ارزش موجودی طلا و ارز
| دارایی | مقدار | نماد | فرمول ارزش (اکسل) |
|---|---|---|---|
| طلای ۱۸ عیار | ۸۵ گرم | g18 | =B2*XLOOKUP(C2;Table1[symbol];Table1[buy]) |
| سکه امامی | ۳ عدد | emami | =B3*XLOOKUP(C3;Table1[symbol];Table1[buy]) |
| دلار | ۱۲۰۰ | usd | =B4*XLOOKUP(C4;Table1[symbol];Table1[buy]) |
برای ارزشگذاری داراییای که در اختیار دارید، نرخ خرید (buy) منطقیتر است؛ چون اگر امروز بفروشید همین را میگیرید.
امنیت کلید در فایلهای اشتراکی
- در گوگل شیت، کلید را در Script Properties بگذارید، نه داخل کد یا یک خانهٔ شیت. اما توجه کنید هر کسی دسترسی ویرایش به فایل دارد، میتواند Apps Script را ببیند.
- فایل اکسل حاوی کوئری با کلید را برای افراد بیرون از سازمان نفرستید؛ قبل از ارسال، کوئری را حذف یا مقادیر را Paste Values کنید.
- برای فایلهای تیمی یک کلید جدا بسازید تا اگر لازم شد، فقط همان را باطل کنید.
نسخهٔ انگلیسی همین آموزش در Live Exchange Rates in Google Sheets and Excel آمده است. اگر تاریخچهٔ روزانه هم در اکسل لازم دارید، دیتای تاریخی قیمت دلار و طلا را ببینید.
طلای ۱۸ عیار۲۵٬۹۱۸٬۷۰۰تومان−۱٫۱۴٪نرخهای لحظهای مرتبط با این مطلب: قیمت طلای ۱۸ عیار، قیمت دلار، قیمت سکه امامی.
نظرات (۰)
نظرها پس از تأیید نمایش داده میشوند؛ برای ارسال، ورود به حساب لازم است.


