วิธีเปิดเวิร์กบุ๊ก Excel ที่ลงท้ายด้วยสตริงที่ระบุโดยใช้ Applescript


0

ฉันยังใหม่กับ Applescript และฉันพยายามเปิดxlsxไฟล์ที่ลงท้ายด้วย DK.xlsx พยายามใช้รหัสต่อไปนี้ แต่ใช้งานไม่ได้ ฉันทำอะไรผิดที่นี่ กรุณาช่วย.

set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

set sourcefile to name of every file of sourcefilepath whose name ends with "DK.xlsx"

tell application "Microsoft Excel"

    open workbook workbook file name sourcefile

end tell

ทำไมคุณไม่ใช้ฟังก์ชั่นการค้นหาของ Finders
Harcker

ก่อนที่จะพยายามเปิดsourcefileทำไมไม่ลองเอาท์พุทชื่อของsourcefileเพื่อดูว่ามีการมอบหมายอะไรบ้าง กล่องโต้ตอบหน้าต่างจะเพียงพอและเป็นเพียงสำหรับการดีบัก
อัลลัน

@nprabu คุณจัดการเพื่อให้มันเรียง?
CJK

คำตอบ:


2

เนื่องจากคุณใหม่กับ AppleScript และเนื่องจากสคริปต์ที่คุณให้มีข้อผิดพลาดพื้นฐานมากมายคำตอบนี้ค่อนข้างยาวเพราะฉันคิดว่าเหมาะสมที่จะอธิบายวิธีแก้ไขสคริปต์และสาเหตุข้อผิดพลาดเกิดขึ้นตั้งแต่แรก

อย่างไรก็ตามเพื่อประโยชน์ของผู้อ่านที่จะใช้TL; DRนี่คือสองเวอร์ชันของสคริปต์ในรูปแบบที่สมบูรณ์ของพวกเขาแต่ละไฟล์ที่ต่างกันในการค้นหาไฟล์และคำสั่งที่ส่งไปยังExcelเพื่อเปิด มัน / พวกเขา

Disclaimer: ฉันยังไม่ได้สามารถที่จะทดสอบอย่างเต็มที่สคริปต์ที่ผมไม่ได้เป็นเจ้าของสำเนาของโปรแกรม Microsoft Excel ผมมีสูตรตัวอย่างเหล่านี้ขึ้นอยู่กับรุ่นออนไลน์ของพจนานุกรม AppleScript หากคุณพบข้อผิดพลาดของสคริปต์ความคิดเห็นของคุณจะช่วยฉันแก้ไข

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

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    try
        tell application "Finder" to set sourcefile to ¬
            (the first file in the folder sourcefilepath whose ¬
                name ends with "DK.xlsx") as text
    on error
        return display notification ¬
            "No filenames ending in \"DK.xlsx\"" with title "File Not Found"
    end try

    tell application "Microsoft Excel" to ¬
        open workbook workbook file name sourcefile

version รุ่นนี้ใช้openคำสั่งมาตรฐานที่รับอย่างน้อยหนึ่งวัตถุfileหรือ aliasใช้เวอร์ชันนี้หากคุณต้องการเปิดหลายไฟล์อย่างง่ายดายหรือสคริปต์เวอร์ชั่นด้านบนไม่สามารถเปิดไฟล์ได้:

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    tell application "Finder" to set sourcefiles to ¬
        (every file in the folder sourcefilepath whose ¬
            name ends with "DK.xlsx") as alias list

    if sourcefiles is {} then return display notification ¬
        "No filenames ending in \"DK.xlsx\"" with title "File Not Found"

    tell application "Microsoft Excel" to open the sourcefiles

③ภาคผนวก: สคริปต์ฉุกเฉิน:

ขอบคุณที่@ user3439894สำหรับการทดสอบสคริปต์เหล่านี้และรายงานพฤติกรรมแปลก ๆ จากMicrosoft Excelเกี่ยวกับวิธีการตอบสนองต่อopenคำสั่งมาตรฐาน(ดูหัวข้อความคิดเห็นที่แนบมากับคำตอบนี้)

โดยพื้นฐานแล้วมันจะทำงานตามที่คาดไว้หากExcelยังไม่ได้ทำงานและจะเปิดหลายไฟล์ (ในพื้นหลัง) อย่างไรก็ตามหากExcelเปิดอยู่แล้วจะเปิดเพียงหนึ่งไฟล์จากรายการไฟล์ที่กำหนดและไฟล์ที่เลือกเปิดดูสุ่ม

ดังนั้นฉันจึงเพิ่มสคริปต์รุ่นที่สามนี้เป็นวิธีการที่สง่างามน้อยกว่าในการเปิดหลายไฟล์ แต่สิ่งหนึ่งที่จะรับมือกับปัญหาบุคลิกภาพของExcel :

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    tell application "Finder" to set sourcefiles to ¬
        (every file in the folder sourcefilepath whose ¬
            name ends with "DK.xlsx") as alias list

    if sourcefiles is {} then return display notification ¬
        "No filenames ending in \"DK.xlsx\"" with title "File Not Found"

    tell application "Microsoft Excel"
        activate -- Bring Excel into focus

        -- This loops through the list of files and
        -- opens them one at a time
        repeat with sourcefile in sourcefiles
            open the sourcefile
        end repeat
    end tell

แน่นอนว่าคุณสามารถลองและแทนที่open the sourcefileด้วยopen workbook workbook file name (sourcefile as text)คำสั่งนั้นควรทำงานในเวอร์ชันของคุณ แต่ไม่เช่นนั้นคุณก็สามารถใช้งานopenได้


รายละเอียดโดยละเอียด

การดึงไฟล์ของคุณ

ข้อผิดพลาดเล็กน้อยแรกในสคริปต์ต้นฉบับของคุณเกิดขึ้นจากบรรทัดนี้:

set sourcefile to name of every file of sourcefilepath ¬
    whose name ends with "DK.xlsx"

(ฉันแบ่งรหัสเป็นสองบรรทัดเพื่อให้สามารถอ่านได้ซึ่งจะไม่มีผลกับวิธีที่ AppleScript เรียกใช้งานคำสั่ง)

▸ประการแรกคำสั่งนี้จะต้องส่งไปยังแอปพลิเคชันที่สามารถจัดการวัตถุไฟล์และโฟลเดอร์ สองตัวเลือกที่คุณต้องมีการค้นหาและระบบกิจกรรม Finderเหมาะสำหรับการใช้งานกับคำสั่งไฟล์ทั่วไป ในการส่งคำสั่งไปยังFinderคุณเพียงเพิ่มส่วนtellคำสั่งที่จุดเริ่มต้นของบรรทัด:

tell application "Finder" to set sourcefile to ¬
    name of every file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx"

คุณต้องระบุว่าsourcefilepathเป็นวัตถุในโฟลเดอร์ซึ่งฉันได้ทำไปแล้วโดยการเพิ่มตัวระบุวัตถุไว้folderด้านหน้าของตัวแปร

question คำถามของคุณตามที่ระบุไว้พร้อมกับชื่อตัวแปร AppleScript ที่คุณเลือกหมายความว่าคุณต้องการเปิดไฟล์เดียว อย่างไรก็ตามคำสั่งที่เราเพิ่งดูจะบอกให้Finder Finderได้รับevery fileซึ่งจะส่งคืนรายการของรายการ (แม้ว่ามันอาจจะเป็นรายการที่มีเพียงหนึ่งรายการ) แทนที่จะเป็นรายการเดียว หากมีหลายไฟล์ที่ชื่อลงท้ายด้วย "DK.xlsx" ไฟล์เหล่านั้นทั้งหมดจะถูกส่งกลับในรายการนี้ นี้จะทำให้เกิดปัญหาเมื่อมันมาถึงการเปิดไฟล์โดยใช้คำสั่งของExcelopen workbookซึ่งสามารถจัดการได้เพียงหนึ่งไฟล์ต่อคำสั่งคำสั่ง

หากคุณแน่ใจว่ามีชื่อไฟล์เดียวเท่านั้นที่ลงท้ายด้วย "DK.xlsx" คุณสามารถเปลี่ยนeveryเป็นfirst:

tell application "Finder" to set sourcefile to ¬
    the name of the first file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx"

(ฉันนำหน้าข้อกำหนดบางข้อไว้ด้วยtheเพื่อให้อ่านได้ง่ายขึ้น AppleScript ยินดีที่จะมีหรือไม่theอยู่ด้วย)

ข้อควรพิจารณาอื่น ๆ คือopen workbookต้องการให้ระบุพา ธ เต็มไปยังไฟล์ อย่างไรก็ตามเมื่อขอให้Finderส่งคืนเฉพาะnameไฟล์คุณจะได้รับชื่อไฟล์โดยไม่มีพา ธ เพื่อดึงข้อมูลพา ธ แบบเต็มให้ลบคำร้องขอสำหรับnameคุณสมบัติของไฟล์และแทนที่จะเรียกคืนอ็อบเจ็กต์ไฟล์ซึ่งคุณสามารถบีบอัดเป็นข้อความได้:

tell application "Finder" to set sourcefile to ¬
    (the first file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx") as text

▸หากปรากฎว่าคุณต้องการกู้คืนไฟล์หลายไฟล์ที่ลงท้ายด้วยคำต่อท้าย "DK" จากนั้นจึงเป็นการดีที่สุดที่จะบังคับรายการของวัตถุไฟล์ให้เป็นalias list(ซึ่งเป็นรายการของนามแฝง) นี่คือเพื่อให้เราสามารถใช้openคำสั่งมาตรฐานแทนopen workbookเนื่องจากเดิมสามารถยอมรับรายการของชื่อแทนไฟล์หลาย ๆ ไฟล์ทำให้คุณสามารถเปิดไฟล์จำนวนมากด้วยคำสั่งเดียว

tell application "Finder" to set sourcefile to ¬
    (every file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx") as alias list

การเปิดไฟล์ในExcel

คุณไม่ได้พูดถึงรุ่นของMicrosoft Excel ที่คุณใช้ซึ่งอาจกลายเป็นข้อมูลที่เกี่ยวข้อง คำถามในฟอรัมนี้จากปี 2009 มาจากผู้ใช้ที่รายงานปัญหาเมื่อใช้open workbookคำสั่ง

แต่ ... สมมติว่าในตอนนี้คำสั่งจะทำงานกับเวอร์ชันของคุณและคุณต้องการเปิดไฟล์เพียงไฟล์เดียว ไวยากรณ์ตามที่คุณได้รับมันถูกต้องทั้งหมดและการปรับปรุงที่ฉันกล่าวถึงข้างต้นเพื่อดึงเส้นทางไฟล์แบบเต็มจะป้องกันopen workbookคำสั่งจากการโยนข้อผิดพลาดเนื่องจากการอ้างอิงไฟล์ที่ไม่ดี หนึ่งสำนวนโวหาร: คุณสามารถเขียนtellคำสั่งและopen workbookคำสั่งในบรรทัดเดียวแล้วลบend tellบรรทัด:

tell application "Microsoft Excel" to open workbook workbook file name sourcefile

ไม่มีแบบฟอร์มใดที่ดีไปกว่าแบบฟอร์มอื่นดังนั้นจึงเป็นตัวเลือกส่วนบุคคล

post โพสต์ฟอรั่มที่ฉันกล่าวถึงข้างต้นซึ่งรายงานopen workbookคำสั่งการชำรุดยังอ้างถึงปัญหาเดียวกันเมื่อใช้openคำสั่งมาตรฐาน แต่นี้โพสต์กองมากเกินให้สาเหตุและให้ความมั่นใจกับผมว่านี้openคำสั่งจะทำงานที่open workbookคำสั่งอาจจะไม่

โดยทั่วไปในทางเดียวกันว่าFinderโปรแกรมต้องวัตถุโฟลเดอร์ที่จะได้รับการระบุไว้อย่างชัดเจนว่าเป็นfolder, Excelความต้องการวัตถุไฟล์ที่จะระบุไว้อย่างชัดเจนว่าเป็นfile(หรือalias):

tell application "Microsoft Excel" to open file sourcefile

benefit ประโยชน์ของopenคำสั่งนี้คือสามารถรับรายการของนามแฝงเพื่อเปิดหลายไฟล์พร้อมกัน ดังนั้นหากคุณตัดสินใจที่จะเก็บเวอร์ชันของคำสั่งFinderที่ดึงข้อมูลหลายไฟล์ตรวจสอบให้แน่ใจว่าคุณได้บังคับให้มันเป็นไฟล์alias listซึ่งคุณสามารถใช้ดังนี้:

tell application "Microsoft Excel" to open sourcefile

หมายเหตุที่นี่ที่fileระบุวัตถุจะขาดเมื่อเปิดไฟล์หลายเพราะตัวแปรที่มีอยู่แล้วของประเภทที่ถูกต้องคือsourcefilealias list

การปิดความคิดเห็น

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

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

tell application "Microsoft Excel" to activate

หรือ - รวมเข้ากับคำสั่งExcelที่มีอยู่:

tell application "Microsoft Excel"
    activate
    open file sourcefile
end tell

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


นี่อาจเป็นปัญหารุ่นของ Excel อย่างไรก็ตามด้วย with เมื่อ Excel เปิดอยู่แล้วจะเปิดเพียงหนึ่งไฟล์ในไฟล์listและไม่จำเป็นต้องเป็นไฟล์แรก ด้วย Excel ที่ยังคงเปิดอยู่หากคุณปิดไฟล์หนึ่งไฟล์ในรายการที่เปิดไว้และเรียกใช้สคริปต์อีกครั้งจะเป็นการเปิดไฟล์อื่น แต่จะมีเพียงไฟล์เดียวเท่านั้นในรายการและอื่น ๆ ซึ่งหลุดออกมาเป็นพฤติกรรมที่แปลกจริงๆ การใช้การrepeat วนซ้ำบนlistเป็นวิธีแก้ปัญหา
user3439894

1
@ user3439894 ขอบคุณสำหรับการทดสอบสำหรับฉัน ฉันทดสอบกับแอพอื่น ๆ เช่นTextEditและKeynote (ทั้งแอป Apple, คำนึงถึงคุณ) และทำตามที่ฉันคาดไว้และต้องการให้ทำ เป็นความอัปยศที่Excelไม่สอดคล้อง ดูเหมือนว่าฉันจะต้องใช้repeatวง มันจะทำงานอย่างไรเมื่อExcelยังไม่เปิด? คือExcelหนึ่งในปพลิเคชันที่ยืนยันว่าฉันactivateมันเป็นครั้งแรก?
CJK

เมื่อปิด Excel แล้วและทดสอบกับรายการไฟล์ทั้ง 3 รายการจะเปิดทั้งสามรายการและ Excel อยู่ในพื้นหลังยกเว้นว่าactivateมีการใช้งาน
user3439894

1
JSYK เวอร์ชั่นที่อัปเดตของคุณและตัวเลือก "แทนที่open the source fileด้วยopen workbook workbook file name (source file as text)" ทำงานได้ +1 สำหรับคำตอบที่ยอดเยี่ยม!
user3439894

@CJK ขอบคุณมากสำหรับคำตอบโดยละเอียดนี่ช่วยได้มาก ฉันทดสอบทั้งสามตัวเลือกที่คุณให้ไว้และมันทำงานได้ตามที่คาดไว้ ฉันใช้เวอร์ชั่น Excel 2016 ขอบคุณอีกครั้ง.
nprabu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.