2017-04-06 4 views
0

Numbers 테이블에 대한 내 스크립트에서 copy 명령을 사용하여 발생할 수 있다고 생각되는 반복 루프에서 극단적 인 (셀 당 3-4 초) 정지가 발생합니다. 내가 이해하기 때문에 copyset 명령과 같은 값을 대체하는 대신 값에 대한 새로운 참조를 만듭니다. copy 명령, Mac 또는 명령 시퀀스에서 루프를 잘못 배치했는지 확신 할 수 없습니다. 내가 도움이되지 않는 명령 시퀀스를 전환 해 보았습니다. 비슷한 copy 루프의 다른 용도는 너무 느리게 동작하지 않습니다. 제 질문은 일종의 복합적인 질문입니다. 루프를 많은 부분을 처리하도록 요청하고 있습니까, 잘못 놓았습니까? copy이 아닌 다른 것을 사용해야합니까, 아니면 단순히 Mac입니까? (메모리가 정지를 유발할 정도로 낮지는 않지만 여전히 정지 중에 1.5GB가 남았습니다. 숫자와 스크립트 실행을 제외하고는 아무 것도 없습니다.) 요약하면 어떻게 중단 문제를 해결할 수 있습니까?반복 루프의 극단적 인 중단

요령이 시작되는 루프의 부분은 참조를 위해 전체 스크립트가 경우에, 여기 내 다른 copy 사용에 자사의 혼합 문제

-- This is where the extreme hang begins 

repeat with x from 1 to (count rows) - 2 
    repeat with y from 1 to count monthNames 
     copy incrementDates(y) of me to {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
     set monthStart to theDateString 
     set monthEnd to theMonthIndex & "/" & monthLengthInDays & "/" & theYear as text 
     set theFormula to "=SUMIFS(Amount,Category,A,Date, \">=" & monthStart & "\",Date, \"<=" & monthEnd & "\")" 
     set value of cell (y + 1) of row (x + 1) to theFormula 
    end repeat 
end repeat 

-- Extreme hang ends and script continues normally 

이하입니다.

set moneyInHeaders to {"Last Name", "First Name", "Receipt Number", "Payment", "Date", "Office", "City", "Referral Name"} 
set locationList to {"Location 1", "Location 2"} 
set the monthNames to {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} 
set moneyOutHeaders to {"Expense", "Amount", "Date", "Category", "Item"} 
set categoryItems to {"Marketing", "Software", "Tools", "Utilities", "Other"} 
set thisYearName to (year of (current date)) as string 
set moneyInColor to {31354, 51657, 22615} 
set moneyOutColor to {59623, 20816, 14391} 

tell application "Numbers" 
if not (exists document 1) then make new document 
tell document 1 
    delete every sheet 
    set the name of sheet 1 to "Money In" 
    tell sheet 1 
     delete every table 
     set moneyInTable to make new table with properties {name:"Money In", position:{-7, 29}, width:788, column count:count moneyInHeaders, row count:14, footer row count:1, header column count:2} 
     tell moneyInTable 
      set locationCount to count locationList -- get count of locations 
      set properties of row 1 to {background color:{moneyInColor}} 
      my populateCells(moneyInTable, row 1, moneyInHeaders, false) -- fill header row values 
      set value of last cell of column named "Payment" to ("=SUM(C)") 
      my populateCells(moneyInTable, column named "Office", locationList, true) -- fill pop up menu values 
      my formatCells(moneyInTable, column named "Payment", currency) 
      my formatCells(moneyInTable, column named "Date", date and time) 
      my formatCells(moneyInTable, column named "Office", pop up menu) 
      delete (rows 2 through (locationCount + 1)) -- remove rows that contain values so the pop up column is empty 
      repeat locationCount times -- add the rows back to keep table size 
       add row below row 2 
      end repeat 
     end tell -- end telling moneyInTable 

     -- Set locked false for now 
     set totalsTable to make new table with properties {name:"Money In Totals", locked:false, position:{785, 29}, column count:2, row count:(count monthNames) + 2, header column count:1, header row count:1, footer row count:1} 
     tell totalsTable 
      set properties of row 1 to {background color:{moneyInColor}} 
      my populateCells(totalsTable, column "A", monthNames, true) 
      set value of last cell of column "A" to "Grand Total" 
      set value of cell "B1" to "Totals" 
      set value of last cell to ("=SUM(B)") 
      tell column "B" 
       repeat with x from 1 to count monthNames -- loop and increment dates for the SUMIFS formula 
        copy incrementDates(x) of me to {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
        set monthStart to theDateString 
        set monthEnd to theMonthIndex & "/" & monthLengthInDays & "/" & theYear as text 
        set the value of cell (x + 1) to ("=SUMIFS(Payment,Date, \">=" & monthStart & "\", Date, \"<=" & monthEnd & "\")") 
       end repeat 
      end tell -- end telling column B 
     end tell -- end telling totalsTable 
    end tell -- end telling active sheet 

    make new sheet with properties {name:"Money Out"} 
    tell sheet 2 
     delete every table 
     set moneyOutTable to make new table with properties {name:"Money Out", position:{-7, 29}, width:710, column count:count moneyOutHeaders, row count:14, footer row count:1} 
     tell moneyOutTable 
      set catCount to count categoryItems -- get count of categoryItems 
      set properties of column "A" to {width:180} 
      set properties of row 1 to {background color:{moneyOutColor}} 
      set value of last cell of column "B" to ("=SUM(B)") 
      my populateCells(moneyOutTable, row 1, moneyOutHeaders, false) -- fill header row values 
      my populateCells(moneyOutTable, column named "Category", categoryItems, true) -- fill pop up values 
      my formatCells(moneyOutTable, column "A", text) 
      my formatCells(moneyOutTable, column named "Amount", currency) 
      my formatCells(moneyOutTable, column named "Date", date and time) 
      my formatCells(moneyOutTable, column named "Category", pop up menu) 
      my formatCells(moneyOutTable, column named "Item", text) 
      delete (rows 2 through (catCount + 1)) -- remove rows that contain values so the pop up menu is empty 
      repeat catCount times -- add the rows back to keep table size 
       add row below row 2 
      end repeat 
     end tell -- end telling moneyOutTable 

     set totalsTable to make new table with properties {name:"Money Out Totals", locked:false, position:{744, 29}, column count:2, row count:(count monthNames) + 2, header column count:1, header row count:1, footer row count:1} 
     tell totalsTable 
      set properties of row 1 to {background color:{moneyOutColor}} 
      my populateCells(totalsTable, column "A", monthNames, true) 
      set value of last cell of column "A" to "Grand Total" 
      set value of cell "B1" to "Totals" 
      set value of last cell to ("=SUM(B)") 
      tell column "B" 
       repeat with x from 1 to count monthNames -- oop and increment dates for the SUMIFS formula 
        copy incrementDates(x) of me to {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
        set monthStart to theDateString 
        set monthEnd to theMonthIndex & "/" & monthLengthInDays & "/" & theYear as text 
        set theFormula to ("=SUMIFS(Amount,Date, \">=" & monthStart & "\", Date, \"<=" & monthEnd & "\")") 
        set the value of cell (x + 1) to theFormula 
       end repeat 
      end tell -- end telling column B 
     end tell -- end telling totalsTable 

     set summaryTable to make new table with properties {name:"Category Totals", position:{943, 29}, column count:2, row count:(catCount) + 1} 
     tell summaryTable 
      set properties of row 1 to {background color:{moneyOutColor}} 
      set value of cell "B1" to "Totals" 
      my populateCells(summaryTable, column "A", categoryItems, true) 
      my formatCells(summaryTable, column "B", currency) 
      tell column 2 
       repeat with x from 2 to the count of cells 
        set theFormula to ("=SUMIFS(Amount,Category,A)") 
        set the value of cell x to theFormula 
       end repeat 
      end tell -- end telling column 2 
     end tell -- end telling summaryTable 

     -- Extreme hang starts on this table, specifically below where noted 

     set breakDownTable to make new table with properties {name:"Expenses By Month", column count:(count monthNames) + 1, row count:(count categoryItems) + 2, header column count:1, footer row count:1, header row count:1} 
     tell breakDownTable 
      set properties of row 1 to {background color:{moneyOutColor}} 
      my populateCells(breakDownTable, row 1, monthNames, true) 
      my populateCells(breakDownTable, column "A", categoryItems, true) 
      my formulateRow(breakDownTable, last row, "SUM") 
      set selection range to range "B2:M8" 
      set properties of selection range to {format:currency} 
      set value of last cell of column "A" to "Total" 

--***** This is where the extreme hang begins 

      repeat with x from 1 to (count rows) - 2 
       repeat with y from 1 to count monthNames 
        copy incrementDates(y) of me to {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
        set monthStart to theDateString 
        set monthEnd to theMonthIndex & "/" & monthLengthInDays & "/" & theYear as text 
        set theFormula to "=SUMIFS(Amount,Category,A,Date, \">=" & monthStart & "\",Date, \"<=" & monthEnd & "\")" 
        set value of cell (y + 1) of row (x + 1) to theFormula 
       end repeat 
      end repeat 

--***** Extreme hang ends and script continues normally 

      add column after last column -- add a totals column after everything else is done 
      set totalsColumn to the last column 
      tell totalsColumn 
       set value of cell 1 to "Total" 
       my formulateColumn(breakDownTable, totalsColumn, "SUM") 
      end tell -- end telling totalsColumn 
     end tell -- end telling breakDownTable 
    end tell -- end telling sheet 2 

    make new sheet with properties {name:"Overview"} 
    tell sheet 3 
     delete every table 
     set cashFlowTable to make new table with properties {name:"Cashflow", column count:2, row count:(count monthNames) + 2, footer row count:1} 
     tell cashFlowTable 
      my populateCells(cashFlowTable, column "A", monthNames, true) 
      set value of last cell of column "A" to "Grand Total" 
      my formatCells(cashFlowTable, column "B", currency) 
      set value of cell "B1" to "Cashflow Totals" 
      set value of last cell to ("=SUM(B)") 
      tell column 2 
       repeat with x from 1 to count monthNames 
        set value of cell (x + 1) to ("=Money In::Money In Totals::Totals " & item x of monthNames & "−Money Out::Money Out Totals::Totals " & item x of monthNames) 
       end repeat 
      end tell -- end telling column 2 
     end tell -- end telling cashflow table 
    end tell -- end telling sheet 3 
    set active sheet to first sheet 
end tell -- end telling document 
end tell -- end telling Numbers 

using terms from application "Numbers" 

to populateCells(theTable, theDirection, theListToUse, usingHeaders) 
    tell theTable 
     set x to 1 
     if usingHeaders is true then 
      repeat with x from 1 to count theListToUse 
       set value of cell (x + 1) of theDirection to (item x of theListToUse) 
      end repeat 
     else 
      repeat with x from 1 to count theListToUse 
       set value of cell x of theDirection to (item x of theListToUse) 
      end repeat 
     end if 
    end tell 
end populateCells 

to formatCells(theTable, theDirection, theFormat) 
    tell theTable 
     set theRange to ¬ 
      ((name of cell 2 of theDirection) & ":" & ¬ 
       (name of last cell of theDirection)) 
     set selection range to range theRange 
     set properties of selection range to {format:theFormat} 
    end tell 
end formatCells 

to colorCells(theTable, theDirection, theColor) 
    tell theTable 
     set theRange to ¬ 
      ((name of cell 2 of theDirection) & ":" & ¬ 
       (name of last cell of theDirection)) 
     set selection range to range theRange 
     set properties of selection range to {background color:theColor} 
    end tell 
end colorCells 

to formulateColumn(theTable, theColumn, theType) 
    tell theTable 
     tell theColumn 
      repeat with i from 2 to the count of cells 
       set thisRow to the row of cell i 
       set rangeStart to the name of cell 2 of thisRow 
       set rangeEnd to the name of cell -2 of thisRow 
       set theFormula to ("=" & theType & "(" & rangeStart & ":" & rangeEnd & ")") as string 
       set value of cell i to theFormula 
      end repeat 
     end tell 
    end tell 
end formulateColumn 

to formulateRow(theTable, theRow, theType) 
    tell theTable 
     tell theRow 
      repeat with i from 2 to the count of cells 
       set thisColumn to the column of cell i 
       set rangeStart to the name of thisColumn 
       set rangeEnd to the name of thisColumn 
       set theFormula to ("=" & theType & "(" & rangeStart & ":" & rangeEnd & ")") as string 
       set value of cell i to theFormula 
      end repeat 
     end tell 
    end tell 
end formulateRow 

end using terms from 

to incrementDates(tempMonth) 
    copy (current date) to tempDate 
    set day of tempDate to 1 
    set month of tempDate to tempMonth 
    set theDayName to weekday of tempDate 
    set theDayIndex to day of tempDate 
    set theMonth to month of tempDate 
    set theMonthIndex to theMonth as integer 
    set theMonthName to theMonth as string 
    set theYear to year of tempDate 
    set theDateString to short date string of tempDate 
    repeat with i from 1 to 32 
     set tempDate to tempDate + (1 * days) 
     if month of tempDate is not theMonth then 
      set monthLengthInDays to i 
      exit repeat 
     end if 
    end repeat 
    return {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
end incrementDates 
+0

복사를 피하십시오 (현재 날짜). 대신에 : tempDate를 현재 날짜로 설정하십시오. –

+0

@Pat_Morita는 약간 애매합니다. 추론하지 않습니까? incrementDates 핸들러에서 반환 된 값을 어떻게 참조합니까? 적어도 시간을내어 의견을 말하면 의미가 있거나 도움이 될 것입니다. 귀하의 의견은 "내 팔은 왜 상처 입니?"라고 대답하는 것과 같습니다. "당신의 다른 팔을 사용하십시오." – Jesse

답변

0

스크립트 찾고 후, 나는 그것을 실행했고 스크립트를 쓰는 동안 그래서 시스템 또는 여러 테스트 실행에 문제가 잎 설명하고있는 지연이 발생하지 않았다.

위의 설명에서 설명한대로 다음핸들러에서 copy 대신 set 명령을 사용할 수 있습니다. 당신은 아직도 당신이 현재하고있는대로 값을 검색 할 거기에서 그래서

to incrementDates(tempMonth) 
    set tempDate to (current date) 
    set day of tempDate to 1 
    set month of tempDate to tempMonth 
    set theDayName to weekday of tempDate 
    set theDayIndex to day of tempDate 
    set theMonth to month of tempDate 
    set theMonthIndex to theMonth as integer 
    set theMonthName to theMonth as string 
    set theYear to year of tempDate 
    set theDateString to short date string of tempDate 
     repeat with i from 1 to 32 
     set tempDate to tempDate + (1 * days) 
     if month of tempDate is not theMonth then 
      set monthLengthInDays to i 
      exit repeat 
     end if 
    end repeat 
    return {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
end incrementDates 

로 변경 될 수 있습니다 (current date) 핸들러가 호출 될 때마다의 사본 (12 회 전화를) 필요하지 않습니다.

다음으로 처리기가 특별히 필요하지 않은 곳에서 처리기를 만들었습니다.

to formatCells(theTable, theDirection, theFormat) 
    tell theTable 
     set theRange to ¬ 
     ((name of cell 2 of theDirection) & ":" & ¬ 
      (name of last cell of theDirection)) 
    set selection range to range theRange 
    set properties of selection range to {format:theFormat} 
end tell 
end formatCells 

위는

set properties of column named "Payment" to {format:currency} 

의 차이는 무시할를 사용하는 것과 동일하지만 내 일반 가이드는 바퀴를 재발견하지 않는 것입니다. 당신은 또한 당신이 다른 시트에 해당 테이블을 다시 계획하는 경우 totalsTable

to makeMonthlyTotalsTable(theTable, theColor) 
    tell theTable 
     set properties of row 1 to {background color:{theColor}} 
     my populateCells(totalsTable, column "A", monthNames, true) 
     set value of last cell of column "A" to "Grand Total" 
     set value of cell "B1" to "Totals" 
     set value of last cell to ("=SUM(B)") 
     tell column "B" 
      repeat with x from 1 to count monthNames -- loop and increment dates for the SUMIFS formula 
       copy incrementDates(x) of me to {theDayIndex, theMonthIndex, theYear, theDateString, monthLengthInDays} 
       set monthStart to theDateString 
       set monthEnd to theMonthIndex & "/" & monthLengthInDays & "/" & theYear as text 
       set the value of cell (x + 1) to ("=SUMIFS(Payment,Date, \">=" & monthStart & "\", Date, \"<=" & monthEnd & "\")") 
      end repeat 
     end tell -- end telling column B 
    end tell -- end telling totalsTable 
end makeMonthlyTotalsTable 

다시 무시할 차이 어쩌면 생각하지만, 청소기 코드를 생성 할 때 핸들러가 사용될 수있는 처리기를 사용하지 않는.

참고 :이 핸들러를 테스트하지 않았기 때문에 스크립트에서 복사하여 붙여 넣기하고 변수 이름을 전달하도록 변경했지만 색상 이름 변수를 설정하고 선언하는 한 괜찮습니다. monthNames 재산에.

property monthNames : {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} 
관련 문제