มีคำถามหรือพบปัญหา? โพสต์ได้ที่ GitHub Discussions

Google Sheets มีฟังก์ชัน GOOGLEFINANCE สำหรับอัตราแลกเปลี่ยน ซึ่งเพียงพอสำหรับการแปลงค่าเงินคร่าวๆ แต่มีข้อจำกัดเรื่องแหล่งที่มา เพราะเป็นอัตราตลาดรวมที่ไม่ระบุชื่อซึ่งคุณตรวจสอบหรือเลือกเองไม่ได้ Frankfurter คำนวณอัตราเฉลี่ยจากธนาคารกลางที่คุณตรวจสอบได้ และเมื่อจำเป็นต้องระบุแหล่งที่มาให้ชัดเจน คุณก็ล็อกหน่วยงานเดียวได้ เช่น อัตราอ้างอิง ECB สำหรับภาษีมูลค่าเพิ่มในสหภาพยุโรป, NBP ของโปแลนด์ หรือ PTAX ของบราซิล ข้อมูลย้อนหลังของแหล่งข้อมูลที่ล็อกไว้จะคงอยู่ตามที่ประกาศจริง สูตรด้านล่างสามารถนำไปวางแทนที่ GOOGLEFINANCE ได้ทันที

เริ่มต้นอย่างรวดเร็ว

ไม่ต้องตั้งค่าและไม่ต้องใช้ API key ดึงอัตราแลกเปลี่ยนล่าสุดลงในเซลล์ด้วย IMPORTDATA และ CSV endpoint:

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur")

Sheets จะสร้างตารางขนาดเล็กที่มีคอลัมน์ date,base,quote,rate โดยคอลัมน์ date จะแสดงเป็นตัวเลขลำดับวันที่ ให้เลือกคอลัมน์แล้วไปที่ รูปแบบ > ตัวเลข > วันที่ (Format > Number > Date) เพื่อแสดงผลเป็นวันที่ หากต้องการดึงหลายสกุลเงินปลายทางพร้อมกัน ให้คั่นด้วยจุลภาค:

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur,gbp,jpy")

การแปลงจำนวนเงิน

IMPORTDATA ส่งคืนเฉพาะอัตราแลกเปลี่ยน ไม่ใช่ยอดเงินที่แปลงแล้ว ให้นำจำนวนเงินไปคูณกับเซลล์อัตราแลกเปลี่ยนที่นำเข้า หรือใช้ฟังก์ชันกำหนดเองด้านล่างเพื่อเรียกใช้งานจบในคำสั่งเดียว

ฟังก์ชันกำหนดเอง

หากต้องการสร้างฟังก์ชัน =FRANKFURTER() ไว้ใช้ซ้ำ ให้เพิ่ม Apps Script สั้นๆ โดยในชีตของคุณไปที่ ส่วนขยาย > Apps Script (Extensions > Apps Script) วางโค้ดนี้แล้วบันทึก:

/**
 * Converts an amount between currencies, at today's rate or on a date.
 * @customfunction
 */
function FRANKFURTER(amount, from, to, date) {
  let url = `https://api.frankfurter.dev/v2/rate/${from}/${to}`;
  if (date) {
    const tz = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
    url += `?date=${Utilities.formatDate(date, tz, "yyyy-MM-dd")}`;
  }
  const data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
  return amount * data.rate;
}

จากนั้นเรียกใช้จากเซลล์ใดก็ได้:

=FRANKFURTER(100, "usd", "eur")

ส่งวันที่เข้าไปเพื่อใช้อัตราแลกเปลี่ยนย้อนหลัง:

=FRANKFURTER(100, "usd", "eur", DATE(2020, 1, 2))

การล็อกแหล่งข้อมูลทางการ

โดยค่าเริ่มต้นคุณจะได้รับอัตราเฉลี่ยรวมจากทุกแหล่งข้อมูล เพิ่ม providers เพื่อล็อกหน่วยงานเดียว ซึ่งสำคัญสำหรับงานภาษีและบัญชี เพราะหลายประเทศกำหนดให้ใช้อัตราที่ประกาศโดยธนาคารกลางของประเทศตนเองเมื่อแปลงยอดเงินตราต่างประเทศ

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur&providers=ecb")
ECB
อัตราอ้างอิงของธนาคารกลางยุโรป มาตรฐานสำหรับภาษีมูลค่าเพิ่มและศุลกากรในสหภาพยุโรป
NBP
ธนาคารแห่งชาติโปแลนด์ (Narodowy Bank Polski) สำหรับการคำนวณภาษีมูลค่าเพิ่มและภาษีเงินได้นิติบุคคลของโปแลนด์
CNB
อัตราประกาศของธนาคารแห่งชาติเช็ก ใช้สำหรับงานบัญชีและภาษีในสาธารณรัฐเช็ก
BCB
อัตรา PTAX ของธนาคารกลางบราซิล (Banco Central do Brasil) มาตรฐานอ้างอิงสำหรับสัญญาและภาษีในบราซิล
BANXICO
อัตรา FIX ของธนาคารกลางเม็กซิโก (Banco de México) สำหรับการชำระภาระผูกพันสกุลดอลลาร์สหรัฐ

ดูแหล่งข้อมูลทั้งหมด แหล่งข้อมูลที่ล็อกไว้จะอัปเดตตามตารางเวลาประกาศของหน่วยงานนั้นเอง อัตราล่าสุดจึงอาจตามหลังอัตราเฉลี่ยรวมอยู่หนึ่งวัน

ข้อมูลอนุกรมเวลาย้อนหลัง

ใช้ from เพื่อกำหนดช่วงวันที่ และใช้ group=month เพื่อยุบรวมเป็นเดือนละหนึ่งแถวพร้อมนำไปสร้างกราฟ ทั้งนี้ ข้อมูลย้อนหลังแบบอัตราเฉลี่ยรวมอาจขยับเล็กน้อยเมื่อมีข้อมูลใหม่เข้ามา ดังนั้นควรล็อกแหล่งข้อมูลเมื่อต้องการให้ตัวเลขคงที่

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?from=1949-12-01&base=usd&quotes=gbp&providers=bbk&group=month")

คิวรีนี้ดึงข้อมูลดอลลาร์สหรัฐเทียบกับปอนด์สเตอร์ลิงย้อนกลับไปถึงปี 1949 จากคลังข้อมูลของธนาคารกลางเยอรมนี (Deutsche Bundesbank) คุณจะเห็นอัตราผูกค่าเงินที่ $2.80 คงที่ต่อเนื่องหลายปีก่อนจะยุติลงในปี 1967 ข้อมูลย้อนหลังลึกๆ มาจากอัตราประกาศที่แฟรงก์เฟิร์ตของ Bundesbank ทั้งดอลลาร์เทียบกับมาร์กเยอรมันตั้งแต่ปี 1948 และคู่เงินดอลลาร์อื่นๆ ส่วนใหญ่ในช่วงปี 1949 ถึง 1970 จากนั้นธนาคารกลางยุโรปจึงรับช่วงต่อตั้งแต่ปี 1999 ดังนั้นหากต้องการอนุกรมเวลายุคปัจจุบันแบบต่อเนื่อง ให้ใช้อัตราเฉลี่ยรวมเริ่มต้นหรือระบุ providers=ecb