Cómo trabajar con sugerencias

Documentos de Google permite que los colaboradores hagan sugerencias que, en realidad, son ediciones diferidas en espera de aprobación.

Cuando usas el método documents.get para recuperar el contenido de un documento, es posible que el contenido incluya sugerencias no resueltas. Para controlar cómo documents.get representa las sugerencias, usa el parámetro opcional SuggestionsViewMode. Las siguientes condiciones de filtro están disponibles con este parámetro:

  • Obtén contenido con SUGGESTIONS_INLINE para que el texto pendiente de eliminación o 挿挿aparezcan en el documento.
  • Obtén contenido como vista previa con todas las sugerencias aceptadas.
  • Obtén contenido como vista previa, sin sugerencias o con todas las sugerencias rechazadas.

Si no proporcionas SuggestionsViewMode, la API de Documentos de Google usa una configuración predeterminada adecuada a los privilegios del usuario actual.

Sugerencias e índices

Una razón por la que SuggestionsViewMode es importante es que los índices en la respuesta pueden variar según si hay sugerencias, como se muestra a continuación.

Contenido con sugerencias Contenido sin sugerencias
{
 "tabs": [
  {
   "documentTab": {
    "body": {
     "content": [
      {
       "startIndex": 1,
       "endIndex": 31,
       "paragraph": {
        "elements": [
         {
          "startIndex": 1,
          "endIndex": 31,
          "textRun": {
           "content": "Text preceding the suggestion\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      },
      {
       "startIndex": 31,
       "endIndex": 51,
       "paragraph": {
        "elements": [
         {
          "startIndex": 31,
          "endIndex": 50,
          "textRun": {
           "content": "Suggested insertion",
           "suggestedInsertionIds": [
            "suggest.vcti8ewm4mww"
           ],
           "textStyle": {}
          }
         },
         {
          "startIndex": 50,
          "endIndex": 51,
          "textRun": {
           "content": "\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      },
      {
       "startIndex": 51,
       "endIndex": 81,
       "paragraph": {
        "elements": [
         {
          "startIndex": 51,
          "endIndex": 81,
          "textRun": {
           "content": "Text following the suggestion\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      }
     ]
    }
   }
  }
 ]
},

{
 "tabs": [
  {
   "documentTab": {
    "body": {
     "content": [
      {
       "startIndex": 1,
       "endIndex": 31,
       "paragraph": {
        "elements": [
         {
          "startIndex": 1,
          "endIndex": 31,
          "textRun": {
           "content": "Text preceding the suggestion\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      },
      {
       "startIndex": 31,
       "endIndex": 32,
       "paragraph": {
        "elements": [
         {
          "startIndex": 31,
          "endIndex": 32,
          "textRun": {
           "content": "\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      },
      {
       "startIndex": 32,
       "endIndex": 62,
       "paragraph": {
        "elements": [
         {
          "startIndex": 32,
          "endIndex": 62,
          "textRun": {
           "content": "Text following the suggestion\n",
           "textStyle": {}
          }
         }
        ],
        "paragraphStyle": {
         "namedStyleType": "NORMAL_TEXT",
         "direction": "LEFT_TO_RIGHT"
        }
       }
      }
     ]
    }
   }
  }
 ]
},

En la respuesta anterior, el párrafo que contiene la línea "Text following the suggestion" muestra la diferencia cuando se usa SuggestionsViewMode. Con el valor establecido en SUGGESTIONS_INLINE, el startIndex de ParagraphElement comienza en 51 y endIndex se detiene en 81. Sin sugerencias, startIndex y endIndex varían de 32 a 62.

Cómo obtener contenido sin sugerencias

En la siguiente muestra de código parcial, se muestra cómo obtener un documento como vista previa con todas las sugerencias rechazadas (si las hay) configurando el parámetro SuggestionsViewMode en PREVIEW_WITHOUT_SUGGESTIONS.

final string SUGGEST_MODE = "PREVIEW_WITHOUT_SUGGESTIONS";
Document doc =
    service
        .documents()
        .get(DOCUMENT_ID)
        .setIncludeTabsContent(true)
        .setSuggestionsViewMode(SUGGEST_MODE)
        .execute();

SUGGEST_MODE = "PREVIEW_WITHOUT_SUGGESTIONS"
result = (
  service.documents()
  .get(
      documentId=DOCUMENT_ID,
      includeTabsContent=True,
      suggestionsViewMode=SUGGEST_MODE,
  )
  .execute()
)

Omitir el parámetro SuggestionsViewMode equivale a proporcionar DEFAULT_FOR_CURRENT_ACCESS como el valor del parámetro.

Sugerencias de estilo

Los documentos también pueden tener sugerencias de estilo. Estos son cambios sugeridos en el formato y la presentación, en lugar de cambios en el contenido.

A diferencia de las inserciones o eliminaciones de texto, estas no compensan los índices (aunque pueden dividir un TextRun en fragmentos más pequeños), sino que solo agregan anotaciones sobre el cambio de estilo sugerido.

Una de esas anotaciones es una SuggestedTextStyle, que consta de 2 partes:

  • El textStyle, que describe cómo se aplica el diseño al texto después del cambio sugerido, pero no indica qué cambió.

  • El textStyleSuggestionState, que indica cómo la sugerencia altera los campos del textStyle.

Puedes ver esto en el siguiente extracto de la pestaña del documento, que incluye un cambio de estilo sugerido:

[01] "paragraph": {
[02]    "elements": [
[03]        {
[04]            "endIndex": 106,
[05]            "startIndex": 82,
[06]            "textRun": {
[07]                "content": "Some text that does not ",
[08]                "textStyle": {}
[09]            }
[10]        },
[11]        {
[12]            "endIndex": 115,
[13]            "startIndex": 106,
[14]            "textRun": {
[15]                "content": "initially",
[16]                "suggestedTextStyleChanges": {
[17]                    "suggest.xymysbs9zldp": {
[18]                        "textStyle": {
[19]                            "backgroundColor": {},
[20]                            "baselineOffset": "NONE",
[21]                            "bold": true,
[22]                            "fontSize": {
[23]                                "magnitude": 11,
[24]                                "unit": "PT"
[25]                            },
[26]                            "foregroundColor": {
[27]                                "color": {
[28]                                    "rgbColor": {}
[29]                                }
[30]                            },
[31]                            "italic": false,
[32]                            "smallCaps": false,
[33]                            "strikethrough": false,
[34]                            "underline": false
[35]                        },
[36]                        "textStyleSuggestionState": {
[37]                            "boldSuggested": true,
[38]                            "weightedFontFamilySuggested": true
[39]                        }
[40]                    }
[41]                },
[42]                "textStyle": {
[43]                    "italic": true
[44]                }
[45]            }
[46]        },
[47]        {
[48]            "endIndex": 143,
[49]            "startIndex": 115,
[50]            "textRun": {
[51]                "content": " contain any boldface text.\n",
[52]                "textStyle": {}
[53]            }
[54]        }
[55]    ],
[56]    "paragraphStyle": {
[57]        "direction": "LEFT_TO_RIGHT",
[58]        "namedStyleType": "NORMAL_TEXT"
[59]    }
[60] }

En el ejemplo anterior, el párrafo consta de 3 ejecuciones de texto, que comienzan en las líneas 6, 14 y 50. Examina la ejecución de texto del medio:

  • Línea 16: Hay un objeto suggestedTextStyleChanges.
  • Línea 18: textStyle especifica varios formatos.
  • Línea 36: textStyleSuggestionState te indica que solo la parte en negrita de esta especificación fue la sugerencia.
  • Línea 42: El estilo en itálica de esta ejecución de texto es parte del documento actual (y no se ve afectado por la sugerencia).

Solo las funciones de estilo configuradas en true en textStyleSuggestionState forman parte de la sugerencia.