ایزی ریت
ورود / ثبت‌نامورود

قیمت لحظه ای طلا در اکسل و گوگل شیت؛ اتصال به API بدون برنامه‌نویسی پیچیده

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

ت
· تحریریه
انتشار ۱۵ آبان ۱۴۰۵، ۱۶:۰۰ · ۴ دقیقه مطالعه
قیمت لحظه ای طلا در اکسل و گوگل شیت؛ اتصال به API بدون برنامه‌نویسی پیچیده
خلاصه در سه خط
  • در گوگل شیت با یک تابع سفارشی Apps Script می‌توانید در هر خانه بنویسید =EZRATE("g18") و قیمت طلای ۱۸ را بگیرید.
  • در اکسل، Power Query با Web.Contents و هدر X-API-Key جدول نرخ‌ها را می‌سازد و با Refresh All تازه می‌شود.
  • کلید را در Script Properties یا پارامتر Power Query نگه دارید و فایل حاوی کلید را با دیگران به اشتراک نگذارید.

حسابداران، کارشناسان بازرگانی و طلافروشانی که محاسباتشان در اکسل است، معمولاً هر صبح نرخ دلار و طلا را از یک سایت کپی و در فایل خود وارد می‌کنند. این کار هم وقت می‌گیرد و هم خطای تایپی می‌سازد. در این آموزش قیمت لحظه ای طلا در اکسل و گوگل شیت را مستقیم از API می‌خوانیم؛ بدون نیاز به دانش برنامه‌نویسی جدی.

i
API ایزی‌ریت
این راهنما با API قیمت ارز و طلای ایزی‌ریت کار می‌کند؛ مستندات کامل، نمونه‌کد و کلید رایگان در صفحهٔ API است.
★
پاسخ کوتاه
در گوگل شیت: کد Apps Script این آموزش را در «Extensions › Apps Script» بچسبانید، کلید را در Script Properties ذخیره کنید و در هر خانه =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()

  1. فایل گوگل شیت را باز کنید و از منوی Extensions گزینهٔ Apps Script را بزنید.
  2. کد زیر را جایگزین کد پیش‌فرض کنید و ذخیره کنید.
  3. از منوی Project Settings (چرخ‌دنده) در بخش Script Properties یک ویژگی با نام EZRATE_KEY و مقدار کلید خود بسازید.
  4. به شیت برگردید و در یک خانه بنویسید =EZRATE("usd"). بار اول گوگل اجازهٔ دسترسی به اینترنت را می‌پرسد.
javascript
/**
 * قیمت لحظه‌ای از 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 را بخواند:

  1. از تب Data گزینهٔ Get Data › From Other Sources › Blank Query را بزنید.
  2. در Power Query Editor از تب Home گزینهٔ Advanced Editor را باز کنید و کد زیر را بچسبانید.
  3. کلید خود را به‌جای YOUR_KEY بنویسید (یا آن را به یک پارامتر Power Query تبدیل کنید).
  4. Close & Load را بزنید؛ جدول نرخ‌ها در یک شیت جدید ساخته می‌شود.
text
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 آمده است. اگر تاریخچهٔ روزانه هم در اکسل لازم دارید، دیتای تاریخی قیمت دلار و طلا را ببینید.

18K
طلای ۱۸ عیار۲۵٬۹۱۸٬۷۰۰تومان−۱٫۱۴٪

نرخ‌های لحظه‌ای مرتبط با این مطلب: قیمت طلای ۱۸ عیار، قیمت دلار، قیمت سکه امامی.

قیمت لحظه ای طلا در اکسل خودکار به‌روز می‌شود؟
بله، اگر در Query Properties به‌روزرسانی دوره‌ای یا هنگام باز کردن فایل را فعال کنید.
آیا در اکسل ۲۰۱۰ هم کار می‌کند؟
اکسل ۲۰۱۰ و ۲۰۱۳ باید افزونهٔ Power Query را جدا نصب کنند. از ۲۰۱۶ به بعد Power Query داخلی است.
تابع EZRATE در گوگل شیت خطای «Exceeded maximum execution time» می‌دهد؟
معمولاً وقتی کش کار نکند و هر خانه درخواست جدا بسازد. کد این آموزش همه را با یک درخواست می‌گیرد؛ مطمئن شوید از همین نسخه استفاده می‌کنید.
می‌توانم قیمت را به ریال بگیرم؟
بله. در آدرس، پارامتر quote=IRR را اضافه کنید.
ت
تحریریهٔ EZRate راهنماها و تحلیل‌های بازار ارز، طلا و رمزارز را با تکیه بر داده‌های واقعی معاملات تهیه می‌کند.
همهٔ مطالب نویسنده ←

نظرات (۰)

نظرها پس از تأیید نمایش داده می‌شوند؛ برای ارسال، ورود به حساب لازم است.

مطالب مرتبط

API و برنامه‌نویسی
مدیریت خطا در API مالی و Rate Limit؛ الگوهایی که سیستم را سرپا نگه می‌دارد
API و برنامه‌نویسی
وب سرویس نرخ درهم و لیر و یورو؛ راهنمای بازرگانی، گردشگری و دانشجویی
API و برنامه‌نویسی
نرخ تتر برای صرافی ارز دیجیتال؛ نرخ مرجع، اسپرد و ترمز اضطراری