หากสคริปต์ Python ทำงานได้จากเทอร์มินัล แต่ไม่สามารถอ่านหรือแก้ไขสเปรดชีตที่เปิดอยู่ใน Calc ได้ แสดงว่าสคริปต์อาจทำงานอยู่นอก LibreOffice มาโคร Python สำหรับ Calc จำเป็นต้องทำงานภายในกระบวนการของ LibreOffice ซึ่ง LibreOffice จะเป็นผู้จัดหาบริบทเอกสารที่ใช้งานอยู่ บันทึกสคริปต์เป็นโมดูลในโฟลเดอร์สคริปต์ Python ของผู้ใช้ ส่งออกฟังก์ชันด้วยคำสั่ง `export` g_exportedScriptsแล้วเรียกใช้จากกล่องโต้ตอบมาโครของ Calc
นี่เป็นวิธีที่ง่ายที่สุดสำหรับการสร้างระบบอัตโนมัติขนาดเล็กที่เชื่อมโยงกับสมุดงานที่เปิดอยู่ความช่วยเหลือเกี่ยวกับการเขียนสคริปต์ Python ของ LibreOffice ในปัจจุบัน ได้อธิบายทั้งมาโครแบบทำงานในกระบวนการเดียวกันและสคริปต์ Python ที่เชื่อมต่อแยกต่างหาก ขั้นตอนด้านล่างนี้ใช้มาโครแบบทำงานในกระบวนการเดียวกัน
เหตุใดสคริปต์ Python ทั่วไปจึงมองไม่เห็นสเปรดชีตที่เปิดอยู่?
LibreOffice เปิดเผยเอกสารปัจจุบันให้กับมาโคร Python ที่กำลังทำงานอยู่ผ่านทางตัวแปรส่วนกลาง (global XSCRIPTCONTEXT) สคริปต์ที่เรียกใช้ด้วยpythonคำสั่งปกติของคุณเป็นกระบวนการแยกต่างหาก ดังนั้นตัวแปรส่วนกลางจึงไม่สามารถใช้งานได้โดยอัตโนมัติ อย่างไรก็ตาม มันยังคงสามารถสื่อสารกับ LibreOffice ได้ แต่ต้องตั้งค่าการเชื่อมต่อ UNO กับกระบวนการ Office ที่กำลังทำงานอยู่แล้ว สำหรับมาโครแรก ให้เรียกใช้ฟังก์ชันภายใน LibreOffice แทน
มาโครในภาษา Python คือฟังก์ชันที่อยู่ใน.pyโมดูล ทูเพิลของโมดูลg_exportedScriptsจะบอก LibreOffice ว่าควรแสดงฟังก์ชันใดบ้างในรายการมาโคร รายละเอียดเหล่านี้มีบันทึกไว้ในเอกสารอ้างอิงการเขียนโปรแกรม Python ของ LibreOffice
จะเพิ่มมาโคร Python ลงใน Calc ได้อย่างไร?
1. ค้นหาโฟลเดอร์สคริปต์ Python ของผู้ใช้
ให้ใช้ตำแหน่ง "มาโครของฉัน"ส่วนตัวหากคุณต้องการสคริปต์ที่สามารถเรียกใช้จากเอกสาร LibreOffice ที่เปิดอยู่ใดๆ ก็ได้สำหรับบัญชีผู้ใช้ของคุณ เอกสาร LibreOffice ระบุโฟลเดอร์นี้ไว้%APPDATA%\LibreOffice\4\user\Scripts\pythonบน Windows, $HOME/.config/libreoffice/4/user/Scripts/pythonLinux และ macOS หากScripts/pythonโฟลเดอร์นี้ยังไม่มีอยู่ ให้สร้างขึ้นมา เอกสาร อ้างอิงตำแหน่งสคริปต์ยังอธิบายถึงคอนเทนเนอร์มาโครอื่นๆ ด้วย ได้แก่ มาโครแอปพลิเคชัน และมาโครที่ฝังอยู่ในเอกสาร
วางโมดูลมาโครไว้ในโฟลเดอร์ Scripts/python ของผู้ใช้ เพื่อให้ LibreOffice สามารถแสดงรายการมาโครนั้นในส่วน "มาโครของฉัน" ได้
มาโครเอกสารจะถูกจัดเก็บไว้ในไฟล์เฉพาะ และสามารถเข้าถึงได้เฉพาะขณะที่เอกสารนั้นเปิดอยู่เท่านั้น สำหรับการใช้งานส่วนตัวที่นำกลับมาใช้ใหม่ได้ โฟลเดอร์ "มาโครของฉัน" มักจะดูแลรักษาง่ายกว่า หลีกเลี่ยงการแก้ไขโฟลเดอร์มาโครของ LibreOffice ซึ่งอาจต้องใช้สิทธิ์ผู้ดูแลระบบ
2. สร้างและส่งออกฟังก์ชันทดสอบขนาดเล็ก
เปิดโปรแกรมแก้ไขข้อความธรรมดา สร้างhello_calc.pyโฟลเดอร์ตามที่ระบุไว้ข้างต้น แล้วเพิ่มข้อความต่อไปนี้:
def hello_calc(*args):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets[0]
sheet.getCellRangeByName("A1").setString("Hello from Python")
g_exportedScripts = (hello_calc,)
ฟังก์ชันนี้จะดึงเอกสารที่เชื่อมต่อกับมาโครในปัจจุบัน เลือกชีตแรก และเขียนข้อความทดสอบที่ไม่เป็นอันตรายลงในเซลล์ A1 บรรทัดสุดท้ายมีความสำคัญ: หากไม่มีทูเปิลที่ส่งออก ฟังก์ชันอาจไม่ปรากฏเป็นมาโครที่สามารถเรียกใช้งานได้ บันทึกไฟล์เป็นข้อความธรรมดาโดยใช้.pyส่วนขยาย .txt ไม่ใช่เอกสารข้อความแบบ Rich Text หรือไฟล์ที่ลงท้ายด้วย.py.txt.txt
ฟังก์ชันที่ส่งออกจะใช้ XSCRIPTCONTEXT เพื่อเข้าถึงเอกสารที่เปิดอยู่และเขียนค่าทดสอบลงในเซลล์ A1
LibreOffice จัดเตรียมตัวแปรXSCRIPTCONTEXTให้กับโมดูลมาโคร แต่จะไม่ส่งตัวแปรนั้นไปยังโมดูลที่นำเข้าโดยโค้ดของคุณโดยอัตโนมัติ ดังนั้นให้การทดสอบครั้งแรกนั้นสมบูรณ์ในตัวเอง หากคุณแยกฟังก์ชันที่นำกลับมาใช้ใหม่ได้ออกเป็นโมดูลอื่นในภายหลัง ให้ปฏิบัติตามคำแนะนำการนำเข้าโมดูล Python ของ LibreOffice
3. เปิดไฟล์ Calc แล้วเรียกใช้ฟังก์ชันที่ส่งออก
- เปิดสเปรดชีตทดสอบใน Calc ใช้สำเนาหรือเวิร์กบุ๊กเปล่าในระหว่างการพัฒนา
- เลือกเครื่องมือ > มาโคร > เรียกใช้มาโคร
- ในรายการไลบรารี ให้ขยายMy Macrosเลือกโมดูล Python และเลือก
hello_calcชื่อมาโครจากรายการ
- คลิกปุ่มRun
ฟังก์ชันเดียวกันนี้สามารถเรียกใช้งานได้จากส่วนขยาย APSO ซึ่ง LibreOffice แนะนำสำหรับการเขียนสคริปต์ Python ในกระบวนการทำงาน และยังมีเชลล์ Python ให้ใช้งานด้วย คุณไม่จำเป็นต้องใช้ APSO สำหรับขั้นตอนการเรียกใช้มาโครพื้นฐานที่อธิบายไว้ในที่นี้
เลือกฟังก์ชัน hello_calc ที่ส่งออกแล้วในส่วน "มาโครของฉัน" จากนั้นเรียกใช้จาก Calc
ค่าที่ปรากฏให้เห็นในเซลล์ A1 ยืนยันว่ามาโครทดสอบได้เข้าถึงเอกสาร Calc และเปลี่ยนแปลงเซลล์แล้ว
จะทำอย่างไรหากมาโครหายไปหรือดูเหมือนว่าจะไม่มีผลอะไรเลย?
ควรตรวจสอบตามลำดับเหล่านี้แทนที่จะเปลี่ยนการตั้งค่าความปลอดภัยโดยรวม:
- โมดูลไม่ปรากฏในรายการ:โปรดตรวจสอบว่าไฟล์อยู่ใน
Scripts/pythonพาธของผู้ใช้ที่ถูกต้อง มี.pyนามสกุลไฟล์ และมีg_exportedScriptsข้อมูลในรูปแบบทูเปิลที่สะกดถูกต้องหรือไม่ เปิดกล่องโต้ตอบมาโครอีกครั้ง หาก LibreOffice ยังคงไม่แสดงไฟล์ที่เพิ่มใหม่ ให้ปิดและเริ่มต้น LibreOffice ใหม่ จากนั้นตรวจสอบอีกครั้ง
- ชื่อมาโครหายไป:ตรวจสอบให้แน่ใจว่าทูเปิลที่ส่งออกมีอ็อบเจ็กต์ฟังก์ชันอยู่ด้วย ตัวอย่างเช่น
(hello_calc,)เครื่องหมายจุลภาคทำให้ทูเปิลนี้เป็นทูเปิล Python ที่มีรายการเดียว
- ไม่มีอะไรปรากฏในเทอร์มินัล:เอาต์พุตจากคำสั่ง
print()ไม่พร้อมใช้งานเมื่อเรียกใช้มาโคร Python จากกล่องโต้ตอบมาโครมาตรฐาน การทดสอบข้างต้นเขียนลงในเซลล์ A1 ดังนั้นผลลัพธ์จึงมองเห็นได้ในชีต สำหรับการดีบักแบบโต้ตอบ เชลล์ของ APSO จะแสดงเอาต์พุต
- การนำเข้าล้มเหลว:การติดตั้งแพ็กเกจสำหรับ Python ในระบบของคุณไม่ได้รับประกันว่ารันไทม์ Python ของ LibreOffice จะสามารถนำเข้าได้ แพ็กเกจต้องมีอยู่ในเส้นทาง Python ของรันไทม์ คำแนะนำการนำเข้าอย่างเป็นทางการอธิบายถึงเส้นทางโมดูลของผู้ใช้และโมดูลที่ใช้ร่วมกัน เริ่มต้นด้วยการทดสอบมาโครโดยไม่ต้องนำเข้าแพ็กเกจเสริม
- จะมีคำเตือนด้านความปลอดภัยปรากฏขึ้น:โปรดเรียกใช้เฉพาะสคริปต์ที่คุณเขียนหรือตรวจสอบและไว้วางใจเท่านั้น การรักษาความปลอดภัยของมาโครมีไว้เพื่อจำกัดโค้ดที่ไม่ปลอดภัย อย่าลดระดับความปลอดภัยโดยรวมเพียงเพื่อเรียกใช้มาโครในเอกสารที่ไม่คุ้นเคยหากต้องการทำความเข้าใจคำเตือน โปรดศึกษา ตัวเลือกความปลอดภัยของมาโคร ใน LibreOffice
เลือกใช้แนวทางการประมวลผลภายนอกเฉพาะเมื่อระบบอัตโนมัติของคุณต้องเริ่มต้นจากเทอร์มินัล ตัวกำหนดเวลา หรือแอปพลิเคชันอื่น LibreOffice กำหนดให้คุณต้องเริ่มต้นกระบวนการของสำนักงานด้วยไปป์หรือซ็อกเก็ต และเชื่อมต่อผ่านบริดจ์ UNO ของมัน สคริปต์แบบสแตนด์อโลนทั่วไปไม่เทียบเท่ากับมาโคร Calc ในกระบวนการเดียวกัน
คุณจะตรวจสอบได้อย่างไรว่ามาโครทำงานถูกต้อง?
หลังจากคลิกปุ่ม Run แล้ว ให้ดูที่เซลล์ A1 ในชีตแรก เซลล์นั้นควรมีข้อความว่า"Hello from Python"และแถบสูตรควรแสดงข้อความเดียวกันเมื่อเลือกเซลล์ A1 หากเซลล์ยังคงไม่เปลี่ยนแปลง ให้ตรวจสอบว่าเวิร์กบุ๊กที่ต้องการใช้งานอยู่ และเลือกมาโครจาก "My Macros" แล้ว เมื่อการทดสอบขั้นต่ำนี้สำเร็จแล้ว ให้แทนที่ข้อความทดสอบด้วยการคำนวณจริงของคุณ และทดสอบกับสำเนาของเวิร์กบุ๊กก่อนที่จะนำไปใช้กับข้อมูลสำคัญ