3

Applescript-ObjC を必要とせずにいくつかの Cocoa フックを利用するには、いくつかの Applescript コードを Scripting Bridge に移動する必要があります。

Applescript で Excel 2008 を使用すると、範囲の値を簡単に取得できます。

set myList to GetValuesFromColumnRange("A", 1, 100)

 on GetValuesFromColumnRange(ColumnLetter, FirstRow, LastRow) -- (string, integer, integer) as list
     set theList to {}
     tell application "Microsoft Excel"
         set theRange to ColumnLetter & FirstRow & ":" & ColumnLetter & LastRow
         set AppleScript's text item delimiters to {return}
         set theList to (get value of range theRange as list)
         set AppleScript's text item delimiters to {""}
     end tell
     set theList to ConvertItemizedListToValueList(theList) of me -- Note this dependency due to how MSE2008 returns the data
     return theList
 end GetValuesFromColumnRange

しかし、Scripting Bridge では、範囲に基づいてワークシートのセルを取得するのに問題があります。以下は私がこれまでに持っているものです。

    Excel2008Application *excelApp = [SBApplication applicationWithBundleIdentifier:@"com.microsoft.Excel"];

    Excel2008Workbook *workbook = excelApp.activeWorkbook;

    SBElementArray *sheets = [workbook sheets];

    Excel2008Sheet *targetSheet;
    int thisSheet = 0;
    int lastSheet = [sheets count]; 

    for (thisSheet = 0; thisSheet < lastSheet; thisSheet++) {
        Excel2008Sheet *currentSheet = [sheets objectAtIndex:thisSheet];
        NSString *currentSheetName = currentSheet.name;
        if ([currentSheetName isEqualToString:@"Metadata"]) {
            targetSheet = currentSheet;
            [targetSheet retain];
        }
    }

    Excel2008Range *range = [[[excelApp classForScriptingClass:@"range"] alloc] initWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:@"A1:A10", @"formulaR1c1", nil]];

    [[targetSheet ranges] addObject:range];
    range = [[targetSheet ranges] lastObject]; // not null; stated class in log: MicrosoftExcelRange

    Excel2008Sheet *valueSheet = range.worksheetObject; // supposed to be new worksheet based upon values within the range; not null; stated class in log: MicrosoftExcelSheet
    [valueSheet retain];

    SBElementArray *valueCells = [valueSheet cells]; // not null, but count is 0
    [valueCells retain];

問題は、実際に からセルを取得する最後の行で発生します。valueSheet返されるセルSBElementArrayは null ではありませんが、オブジェクトも含まれていません。細胞を入れる場合targetSheetも同様です。

私のすべての検索からわかるように、これを行うためのドキュメントは存在せず、できる限りこれを取り上げました。

4

1 に答える 1

1

解決しました。

NSString *rangeName = @"A1:A10";

Excel2008Range *range = [[[excelApp classForScriptingClass:@"range"] alloc] initWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:rangeName, @"name", nil]];
[[targetSheet ranges] addObject:range];

Excel2008Range *currentRange;
if ([[[targetSheet ranges] objectWithName:rangeName] exists]) {
    currentRange = [[targetSheet ranges] objectWithName:rangeName];
}

NSLog(@"[currentRange.value get] = %@", [currentRange.value get]);
// result: ((key),(1),(2),(3),(4),(5),(6),(7),(8),(9)) = NSArray

nameのプロパティに範囲文字列を設定するのがコツのようですExcel2008Range。これに取り組んでいるときに私が見つけた 1 つの落とし穴はformulaR1c1[NSDictionary dictionaryWithObjectsAndKeys:rangeName, @"formulaR1c1", nil]範囲文字列の値で範囲を設定するため、範囲の を設定しないことです。

後から考えると、これは両方のApplescriptでまったく同じコマンドの構文を読むときに実際に理にかなっています...

tell application "Microsoft Excel"
    set theValues to get value of range "A1:A10"
end tell

...そしてobjc-appscript...

NSString *rangeString = @"A1:A10"
MEApplication *microsoftExcel = [MEApplication applicationWithName: @"Microsoft Excel"];
MEReference *cells = [[[microsoftExcel ranges] byName:rangeString] value];
NSArray *cellValues = [cells getItem];

どちらの場合も、範囲の値は、その名前で値の範囲を取得することによって取得されます。しかし、Scripting Bridge では、私の知る限り、範囲オブジェクトの作成時に名前明示的に適用する必要があります。

これを達成するためのより良い方法があると確信しています (通常はあります) が、少なくともこれは機能します。

于 2010-12-14T17:19:11.883 に答える