 +
 +      if (scrollToColumn >= 0 && !this._hasScrolledToColumnTarget && scrollLeft + width <= totalColumnsWidth) {
 +        const scrollRight = scrollLeft + width;
-+        const targetColumn = instanceProps.columnSizeAndPositionManager.getSizeAndPositionOfCell(scrollToColumn);
-+
-+        let isVisible = false;
-+        if (targetColumn.size <= width) {
-+          const targetColumnRight = targetColumn.offset + targetColumn.size;
-+          isVisible = (targetColumn.offset >= scrollLeft && targetColumnRight <= scrollRight);
++        const maxScroll = totalColumnsWidth - width;
++
++        // When scrolling to the rightmost column, we want to go all the way to the right
++        if (scrollToColumn >= columnCount - 1) {
++          this._hasScrolledToColumnTarget = scrollRight >= maxScroll;
 +        } else {
-+          isVisible = (targetColumn.offset >= scrollLeft && targetColumn.offset <= scrollRight);
-+        }
-+
-+        if (isVisible) {
-+          const maxScroll = totalColumnsWidth - width;
-+          this._hasScrolledToColumnTarget = (scrollLeft >= maxScroll || targetColumn.offset === scrollLeft);
++          let isVisible = false;
++          const targetColumn = instanceProps.columnSizeAndPositionManager.getSizeAndPositionOfCell(scrollToColumn);
++          if (targetColumn.size <= width) {
++            const targetColumnRight = targetColumn.offset + targetColumn.size;
++            isVisible = (targetColumn.offset >= scrollRight && targetColumnRight <= scrollRight);
++          } else {
++            isVisible = (targetColumn.offset >= scrollRight && targetColumn.offset <= scrollRight);
++          }
++
++          if (isVisible) {
++            this._hasScrolledToColumnTarget = (scrollLeft >= maxScroll || targetColumn.offset === scrollLeft);
++          }
 +        }
 +      }
 +      if (scrollToRow >= 0 && !this._hasScrolledToRowTarget && scrollTop + height <= totalRowsHeight) {
 +        const scrollBottom = scrollTop + height;
-+        const targetRow = instanceProps.rowSizeAndPositionManager.getSizeAndPositionOfCell(scrollToRow);
 +        const maxScroll = totalRowsHeight - height;
 +
 +        // When scrolling to bottom row, we want to go all the way to the bottom
-+        if (scrollToRow === rowCount - 1) {
++        if (scrollToRow >= rowCount - 1) {
 +          this._hasScrolledToRowTarget = scrollTop >= maxScroll;
 +        } else {
 +          let isVisible = false;
++          const targetRow = instanceProps.rowSizeAndPositionManager.getSizeAndPositionOfCell(scrollToRow);
 +          if (targetRow.size <= height) {
 +            const targetRowBottom = targetRow.offset + targetRow.size;
 +            isVisible = (targetRow.offset >= scrollTop && targetRowBottom <= scrollBottom);

       // Special case where the previous size was 0:
       // In this case we don't show any windowed cells at all.
       // So we should always recalculate offset afterwards.
@@ -594,6 +685,8 @@ var Grid = function (_React$PureComponent) {
       if (this._recomputeScrollLeftFlag) {
         this._recomputeScrollLeftFlag = false;
         this._updateScrollLeftForScrollToColumn(this.props);

       } else {
         (0, _updateScrollIndexHelper2.default)({
           cellSizeAndPositionManager: instanceProps.columnSizeAndPositionManager,
@@ -616,6 +714,8 @@ var Grid = function (_React$PureComponent) {
       if (this._recomputeScrollTopFlag) {
         this._recomputeScrollTopFlag = false;
         this._updateScrollTopForScrollToRow(this.props);
