项目管理:在μ自动化时间表ltiple Projects/Sheets
Before I go into specifics, maybe the simplest form of my question is: can I somehow mimic the functionality of LiquidPlanner's "Smart Schedules" in Smartsheet? (Just to clarify, my company doesn't have LiquidPlanner nor does it plan to, it's just the only product I've heard of that has this functionality out of the box.)
For specifics, here are the challenges I face with my projects (which are all in web content development):
- I need to provide approximate timelines for deliverables in each of my projects.
- Each of my projects has multiple deliverables, each deliverable has 20+ tasks (always essentially the same tasks), and I have at least 3 projects running at any one time. Each task occupies its own row under a parent deliverable row in my project sheets. Each task row has its own start and finish date cells.
- Start/finish dates are constantly in flux due to: 1) My work has to be sent to company-internal clients for review and approval multiple times per deliverable, and their feedback is often overdue. 2) Meetings and unscheduled priority work arise and delay scheduled tasks.
- 如果一个任务被延迟,它很容易去into its project sheet and update the start/finish dates (using dependencies) for its deliverable, creating a new timeline for that deliverable. However, one problem is that this new timeline doesn't take into account the timelines for the other deliverables on the project (housed in the same sheet). The other problem is that this new timeline doesn't take into account the deliverable timelines for other projects (housed in other sheets).
- I don't have the time to manually go check that updating one deliverable's timeline hasn't caused timing and resource conflicts on other deliverables. Because of this, my approximate timelines get less and less accurate all the time.
I'm open to any suggestions, because I guarantee my view of project management is too limited and there are many solutions other than the kind of functionality LiquidPlanner has. I also have limited experience with spreadsheet formulas in general, and am probably missing some easy automation opportunities.
Answers
-
Isaac Jose Employee
Hi Robert,
Thanks for your post! It sounds like you're running into some roadblocks when it comes to managing task dependencies and resources across deliverables and sheets as your projects progress and dates need to be updated. I do have a few suggestions that I hope will be helpful to you:
Track Baseline Schedule Variance
Consider implementing a baseline schedule to track date variance as the project progresses. To do this
- Add two Date columns,Planned StartandPlanned End
- Add one Text/Number column,Variance. In this column, enter the formula=NETWORKDAY([Actual End]@row, [Planned End]@row)-NETWORKDAY Help Article
- When you spin up a project and enter the dates for theActual StartandActual Endof each task, copy and paste these values into thePlanned StartandPlanned Endfields, then hide the columns if desired.
At the start of your project, theVariancecolumn should say 0 for every row. However, as tasks are completed late or early, you'll begin to get a numeric indicator of how late or early any given task was or will be compared to the baseline schedule. This will help adjust the duration and prioritize tasks more effectively to ensure that your overall plan stays on track.
Use the Resource Management features
You mentioned that your sheets don't take resource conflicts into account as the schedule is updated. To help address this, consider using theResource Managementfeatures. WithResource Management and Allocation, you canAssign People to a Taskand set theAllocation %(the percent of each day that the task will take from its assigned resources for its full duration) of a given task. Although Resource Management does not automatically modify task duration, dates, or assignments, it does make it easier to track allocation and ensure that there aren't any resource conflicts.
It can sometimes be a little bit difficult to visualize the labor or effort of a given task as an Allocation percentage through the duration of the task, so I've also come up with a method that converts "Hours of Effort" required to complete a task into an Allocation percentage based on the duration of that task:
- Add a Text/Number column,Hours of Effort. This is the number of hours or amount of labor that you think a task will take.
- Add a Text/Number column,Estimated Allocation, and format it as a percentage.
- In theEstimated Allocationcolumn, enter the following formula
- =([Hours of Effort]@row / (Duration@row * 8))
- 的8above formula refers to the number of hours in a workday. You can adjust this as needed.
The above formula divides the Hours of Effort (labor hours) by the total working hours (duration in workdays multiplied by 8 hours per workday) to return an Estimated Allocation % that can then be copied into the main Allocation % column or adjusted in the column as needed.
Use Dependencies Across Deliverables
You mentioned that adjusting tasks and deliverable timelines is fairly easy using the dependencies features, yet conflicts with tasks in other deliverables are not taken into account. WithDependencies and Predecessors, you can configure dependencies across deliverables the same as you would within a given deliverable. For example, if Deliverable B can't start until Deliverable A is completed, then you'd want to make the first task in Deliverable B dependent upon the completion of the last task in Deliverable A. NOTE: You'll want to make sure that you always define predecessors in the lowest level child rows because entering a predecessor into a summary row or parent row will apply that dependency to all of that parent rows children (tasks/sub tasks).
Cross Sheet Dependencies
You mentioned that you also struggle with adjusted timelines across several sheets. For the resource management piece of this issue, I'm happy to announce that the Resource Management features do take allocation across project sheets into account when calculating total resource allocation.
For non-resource-related roadblocks for tasks which depend upon the start or completion of tasks in other project sheets, there currently isn't a feature which can automatically define dependencies across sheets. When you have a moment, please submit aProduct Enhancement Requestto let our Product team know that you'd like to have this functionality in Smartsheet.
If your project sheets are all shared with the same people and aren't incredibly large, you could consider tracking all active projects under their own hierarchical parent rows within the same sheet. If all your active projects are in one sheet, you can set up dependencies for tasks across projects. For your reference, current sheet size limits can be found here (Insert or Delete Rows or Tasks) and below:
- 200 columns
- 5000 rows
- 200,000 rows (>40 columns means <5000 rows will be available)
If you want to keep your projects in separate sheets, you can mimic cross-sheet dependencies withCell Links. Using Cell Links, you can create a row in Project Sheet A and link in task data from a row in Project Sheet B. Then, in Project Sheet A, you can make tasks dependent upon the cell linked row. As the dates are updated in Project Sheet B, the linked row will also update in Project Sheet A, and dependencies will adjust other rows automatically.
I hope the above has been helpful!
Isaac Jose
Smartsheet Support
-
Thanks so much for taking the time to help out, Isaac. I'll take a look into implementing your suggestions to see if I can solve some of my challenges.
Help Article Resources
Categories
Replace [Employee] if your column has a difference name. This will essentially generate a list of distinct entries and then count them.<\/p>"}]}},"status":{"statusID":3,"name":"Accepted","state":"closed","recordType":"discussion","recordSubType":"question"},"bookmarked":false,"unread":false,"category":{"categoryID":322,"name":"Formulas and Functions","url":"https:\/\/community.smartsheet.com\/categories\/formulas-and-functions","allowedDiscussionTypes":[]},"reactions":[{"tagID":3,"urlcode":"Promote","name":"Promote","class":"Positive","hasReacted":false,"reactionValue":5,"count":0},{"tagID":5,"urlcode":"Insightful","name":"Insightful","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":11,"urlcode":"Up","name":"Vote Up","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":13,"urlcode":"Awesome","name":"Awesome","class":"Positive","hasReacted":false,"reactionValue":1,"count":0}],"tags":[{"tagID":254,"urlcode":"Formulas","name":"Formulas"}]},{"discussionID":109307,"type":"question","name":"Show approval status based on # of approvals vs. denials","excerpt":"I'm looking for a formula that will show \"Yes\", \"Hold\", or \"No\" based on # of approvals. There are 6 total approvals needed, if all 6 approve, then the Approved column would show \"Yes\". If there is 1 or more denials, then the Approved column would show \"No\". If the total of the columns don't equal to 6, then the Approved…","snippet":"I'm looking for a formula that will show \"Yes\", \"Hold\", or \"No\" based on # of approvals. There are 6 total approvals needed, if all 6 approve, then the Approved column would show…","categoryID":322,"dateInserted":"2023-08-22T21:20:12+00:00","dateUpdated":null,"dateLastComment":"2023-08-22T22:04:40+00:00","insertUserID":96646,"insertUser":{"userID":96646,"name":"@SPark","url":"https:\/\/community.smartsheet.com\/profile\/%40SPark","photoUrl":"https:\/\/aws.smartsheet.com\/storageProxy\/image\/images\/u!1!co_Wh_2S-n4!ZAPZGbmgZrw!TRZYwfjvFdi","dateLastActive":"2023-08-22T22:57:22+00:00","banned":0,"punished":0,"private":false,"label":"✭✭✭"},"updateUserID":null,"lastUserID":96646,"lastUser":{"userID":96646,"name":"@SPark","url":"https:\/\/community.smartsheet.com\/profile\/%40SPark","photoUrl":"https:\/\/aws.smartsheet.com\/storageProxy\/image\/images\/u!1!co_Wh_2S-n4!ZAPZGbmgZrw!TRZYwfjvFdi","dateLastActive":"2023-08-22T22:57:22+00:00","banned":0,"punished":0,"private":false,"label":"✭✭✭"},"pinned":false,"pinLocation":null,"closed":false,"sink":false,"countComments":2,"countViews":28,"score":null,"hot":3385482292,"url":"https:\/\/community.smartsheet.com\/discussion\/109307\/show-approval-status-based-on-of-approvals-vs-denials","canonicalUrl":"https:\/\/community.smartsheet.com\/discussion\/109307\/show-approval-status-based-on-of-approvals-vs-denials","format":"Rich","lastPost":{"discussionID":109307,"commentID":392022,"name":"Re: Show approval status based on # of approvals vs. denials","url":"https:\/\/community.smartsheet.com\/discussion\/comment\/392022#Comment_392022","dateInserted":"2023-08-22T22:04:40+00:00","insertUserID":96646,"insertUser":{"userID":96646,"name":"@SPark","url":"https:\/\/community.smartsheet.com\/profile\/%40SPark","photoUrl":"https:\/\/aws.smartsheet.com\/storageProxy\/image\/images\/u!1!co_Wh_2S-n4!ZAPZGbmgZrw!TRZYwfjvFdi","dateLastActive":"2023-08-22T22:57:22+00:00","banned":0,"punished":0,"private":false,"label":"✭✭✭"}},"breadcrumbs":[{"name":"Home","url":"https:\/\/community.smartsheet.com\/"},{"name":"Get Help","url":"https:\/\/community.smartsheet.com\/categories\/get-help"},{"name":"Formulas and Functions","url":"https:\/\/community.smartsheet.com\/categories\/formulas-and-functions"}],"groupID":null,"statusID":3,"image":{"url":"https:\/\/us.v-cdn.net\/6031209\/uploads\/AJ5OBZXXQRAU\/2820-29-intake-smartsheet-com-2023-08-22-14-16-38.png","urlSrcSet":{"10":"","300":"","800":"","1200":"","1600":""},"alt":"(20) Intake - Smartsheet.com 2023-08-22 14-16-38.png"},"attributes":{"question":{"status":"accepted","dateAccepted":"2023-08-22T22:04:29+00:00","dateAnswered":"2023-08-22T21:36:22+00:00","acceptedAnswers":[{"commentID":392011,"body":"
Something like this: =IF([Approval Count]@row = 6, \"Yes\", IF([Denied Count]@row >= 1, \"No\", \"Hold\"))<\/p>"}]}},"status":{"statusID":3,"name":"Accepted","state":"closed","recordType":"discussion","recordSubType":"question"},"bookmarked":false,"unread":false,"category":{"categoryID":322,"name":"Formulas and Functions","url":"https:\/\/community.smartsheet.com\/categories\/formulas-and-functions","allowedDiscussionTypes":[]},"reactions":[{"tagID":3,"urlcode":"Promote","name":"Promote","class":"Positive","hasReacted":false,"reactionValue":5,"count":0},{"tagID":5,"urlcode":"Insightful","name":"Insightful","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":11,"urlcode":"Up","name":"Vote Up","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":13,"urlcode":"Awesome","name":"Awesome","class":"Positive","hasReacted":false,"reactionValue":1,"count":0}],"tags":[]},{"discussionID":109287,"type":"question","name":"Formula help","excerpt":"=IF([WD Schematic End]@row = \"n\/a\", 0, IF([WD Schematic End]@row > [STR Schematic End]@row, 1, 0)) Above formula meant to trigger a red flag if the WD & STR Schematic End dates do not match. The formula I wrote is pulling back 'invalid' ... I am missing something and cannot figure out what!","snippet":"=IF([WD Schematic End]@row = \"n\/a\", 0, IF([WD Schematic End]@row > [STR Schematic End]@row, 1, 0)) Above formula meant to trigger a red flag if the WD & STR Schematic End dates do…","categoryID":322,"dateInserted":"2023-08-22T17:45:32+00:00","dateUpdated":null,"dateLastComment":"2023-08-22T18:30:00+00:00","insertUserID":157887,"insertUser":{"userID":157887,"name":"holli.nunn","url":"https:\/\/community.smartsheet.com\/profile\/holli.nunn","photoUrl":"https:\/\/us.v-cdn.net\/6031209\/uploads\/defaultavatar\/nWRMFRX6I99I6.jpg","dateLastActive":"2023-08-22T18:29:36+00:00","banned":0,"punished":0,"private":false,"label":"✭"},"updateUserID":null,"lastUserID":157887,"lastUser":{"userID":157887,"name":"holli.nunn","url":"https:\/\/community.smartsheet.com\/profile\/holli.nunn","photoUrl":"https:\/\/us.v-cdn.net\/6031209\/uploads\/defaultavatar\/nWRMFRX6I99I6.jpg","dateLastActive":"2023-08-22T18:29:36+00:00","banned":0,"punished":0,"private":false,"label":"✭"},"pinned":false,"pinLocation":null,"closed":false,"sink":false,"countComments":2,"countViews":26,"score":null,"hot":3385456532,"url":"https:\/\/community.smartsheet.com\/discussion\/109287\/formula-help","canonicalUrl":"https:\/\/community.smartsheet.com\/discussion\/109287\/formula-help","format":"Rich","tagIDs":[254],"lastPost":{"discussionID":109287,"commentID":391947,"name":"Re: Formula help","url":"https:\/\/community.smartsheet.com\/discussion\/comment\/391947#Comment_391947","dateInserted":"2023-08-22T18:30:00+00:00","insertUserID":157887,"insertUser":{"userID":157887,"name":"holli.nunn","url":"https:\/\/community.smartsheet.com\/profile\/holli.nunn","photoUrl":"https:\/\/us.v-cdn.net\/6031209\/uploads\/defaultavatar\/nWRMFRX6I99I6.jpg","dateLastActive":"2023-08-22T18:29:36+00:00","banned":0,"punished":0,"private":false,"label":"✭"}},"breadcrumbs":[{"name":"Home","url":"https:\/\/community.smartsheet.com\/"},{"name":"Get Help","url":"https:\/\/community.smartsheet.com\/categories\/get-help"},{"name":"Formulas and Functions","url":"https:\/\/community.smartsheet.com\/categories\/formulas-and-functions"}],"groupID":null,"statusID":3,"image":{"url":"https:\/\/us.v-cdn.net\/6031209\/uploads\/DLAV2H53BW86\/image.png","urlSrcSet":{"10":"","300":"","800":"","1200":"","1600":""},"alt":"image.png"},"attributes":{"question":{"status":"accepted","dateAccepted":"2023-08-22T18:29:34+00:00","dateAnswered":"2023-08-22T18:25:02+00:00","acceptedAnswers":[{"commentID":391943,"body":"
Give this a try:<\/p>
=IF([WD Schematic End]@row = \"n\/a\", 0, IF([WD Schematic End]@row <> [STR Schematic End]@row, 1, 0))<\/p>"}]}},"status":{"statusID":3,"name":"Accepted","state":"closed","recordType":"discussion","recordSubType":"question"},"bookmarked":false,"unread":false,"category":{"categoryID":322,"name":"Formulas and Functions","url":"https:\/\/community.smartsheet.com\/categories\/formulas-and-functions","allowedDiscussionTypes":[]},"reactions":[{"tagID":3,"urlcode":"Promote","name":"Promote","class":"Positive","hasReacted":false,"reactionValue":5,"count":0},{"tagID":5,"urlcode":"Insightful","name":"Insightful","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":11,"urlcode":"Up","name":"Vote Up","class":"Positive","hasReacted":false,"reactionValue":1,"count":0},{"tagID":13,"urlcode":"Awesome","name":"Awesome","class":"Positive","hasReacted":false,"reactionValue":1,"count":0}],"tags":[{"tagID":254,"urlcode":"Formulas","name":"Formulas"}]}],"initialPaging":{"nextURL":"https:\/\/community.smartsheet.com\/api\/v2\/discussions?page=2&categoryID=322&includeChildCategories=1&type%5B0%5D=Question&excludeHiddenCategories=1&sort=-hot&limit=3&expand%5B0%5D=all&expand%5B1%5D=-body&expand%5B2%5D=insertUser&expand%5B3%5D=lastUser&status=accepted","prevURL":null,"currentPage":1,"total":10000,"limit":3},"title":"Trending in Formulas and Functions ","subtitle":null,"description":null,"noCheckboxes":true,"containerOptions":[],"discussionOptions":[]}">