Applescript:编写没有旧文件名的新文件

时间:2014-02-26 04:21:28

标签: ios macos applescript applescript-objc applescript-excel

前言:我的Applescript接受一个Excel文件,并将其数据复制到一个新的纯文本文件中。

我在将新文本文件写入与现有Excel文件相同的位置时遇到问题,但没有原始文件的文件名。

例如:我的Excel文件是“FilenameA.xls”,当我保存新文本文件时,它将其保存为“FilenameA.xlsFilenameB.txt”

如何将此新文件保存到同一位置,但使用我自己的文件名?

注意:当我使用(path to desktop as text)时它会起作用,但我不会一直将它们保存到桌面上。

set myFile to open for access (path to desktop as text) & blahBlah & ".txt" with write permission

当我尝试下面的脚本时,它会给我原始文件名PLUS我的新文件名。

set myFile to open for access (fileName) & blahBlah & ".txt" with write permission

注意:fileName指的是原始Excel文件的路径。

基本上我想要与(path to desktop as text)相同的结果,但可以灵活地将文件保存到访问原始文件的任何文件夹中。

2 个答案:

答案 0 :(得分:1)

感谢您澄清您的要求。基本上,您需要在代码中添加“容器”行,并在新文件路径名中使用它。如果您发布了更多代码,我可以调整其语法,但这应该足以让您弄明白。 下面是一些示例代码,允许您选择excel文件,收集该文件的容器,提示您输入新文件名,然后允许您编写新的txt文件:

set excelFile to (choose file with prompt "Choose Excel file :" of type {"xls", "xlsx"} without invisibles)

tell application "Finder"
    set containerPath to (container of excelFile) as string
    set oldFilename to name of excelFile
end tell

set newFilename to text returned of (display dialog "Enter name of the resulting text file" default answer oldFilename)

set myFile to open for access (containerPath & newFilename & ".txt") with write permission
try
    -- add content to myFile
    write "Here's some groovy content added to the file." to myFile
    close access myFile
on error
    close access myFile
end try

答案 1 :(得分:0)

我有一些改进上述解决方案的建议。

如果您使用"显示的名称"在Excel文件中,它不包含文件扩展名:

set oldFilename to displayed name of excelFile

这样,您最终会在同一文件夹中使用“Spreadsheet.xlsx”和“Spreadsheet.txt”,而不是“Spreadsheet.xlsx.txt。”

您不必编写自己的文本文件,只需打开以进行访问,因为TextEdit可以为您编写文本文件:

tell application "TextEdit"
    make new document with properties {text:"The text file contents."}
    close document 1 saving in file (containerPath & newFilename & ".txt")
end tell

通过这种方式,您可以将TextEdit的复杂性与文本文件结合使用。您创建了一个UTF-8文本文件,不存在将文件打开以进行写访问或任何其他低级磁盘错误的风险。

您还可以使用TextEdit打开现有文件并在其末尾添加文本并再次保存:

tell application "TextEdit"
    open file (containerPath & newFilename & ".txt")
    set the text of document 1 to the text of document 1 & return & "Some more text."
    close document 1 saving yes
end tell