Greetings:
Our team is migrating files from an Airtable field to a SeaTable column using a Python script. After working properly for over 500 records, the following error appears on all remaining rows, which we do not understand, in the line:
resultado.append(base.upload_bytes_file(datoArchivo["name"], respuesta.content, replace=False))
An exception occurred: JSONDecodeError Invalid control character at: line 1 column 26 (char 25) json.decoder.JSONDecodeError: Invalid control character at: line 1 column 26 (char 25)
Things we have tried:
- Check if the problem occurs in a specific Airtable record due to a strange character. We have tried with different records and the same error appears.
- Check if there is any limit in the API that prevents file upload to SeaTable. It does not seem to be on the list of limits.
- Check if it is a problem with the file size. It has worked with 500 records with sizes from Kb to Mb without any problem.
We have copied the whole loop in case the context helps. Thanks for your advice.
for indice, elementoAT in enumerate(listaTablasAT):
print("Analizando tabla "+elementoAT["nombreTablaAT"]+"...")
for regAT in elementoAT["tablaAT"]:
campoAT = limpiarCadena(regAT.get("fields").get(elementoAT["campoComparacionAT"]))
filasTablaST = listaTablasST[indice].get("tablaST")
camposST = filasTablaST.keys()
for campoST in camposST:
if campoAT == campoST:
# Coincidencia para copiar archivos del registro
tabla = listaTablasST[indice].get("nombreTablaST")
idFila = filasTablaST[campoST].get("_id")
if esPrimeraCopia:
# Preparar enlace para subir archivo a SeaTable
# Paso 1: Conseguir enlace para carga
# Paso 2: Carga del archivos en la nube ST
# Paso 3: Actualizar celda con la referencia a los archivos cargados
# Paso 1
enlace = base.get_file_upload_link()
datosFila = datosArchivo(regAT, nombreCampoAT, enlace)
resultado = []
for datoArchivo, respuesta in zip(datosFila[0], datosFila[1]):
# Paso 2
print("Copiando archivos de "+campoAT+".")
resultado.append(base.upload_bytes_file(datoArchivo["name"], respuesta.content, replace=False))
# Si el nombre del archivo se ha actualizado por haber otro archivo con el mismo nombre, actualizamos en la lista
nuevoNombre = resultado[-1]["name"]
url = datoArchivo["url"]
datoArchivo["url"] = url.replace(datoArchivo["name"], nuevoNombre)
datoArchivo["name"] = nuevoNombre
# Paso 3
info = base.update_row(tabla, idFila, {nombreCampoAT: datosFila[0]})
break # Termina en la primera coincidencia
else:
# Solo copiamos si el campo está vacío
if filasTablaST[campoST][nombreCampoAT] == None:
# Preparar enlace para subir archivo a SeaTable
# Paso 1: Conseguir enlace para carga
# Paso 2: Carga de archivos en la nube ST
# Paso 3: Actualizar celda con la referencia a los archivos cargados
# Paso 1
enlace = base.get_file_upload_link()
datosFila = datosArchivo(regAT, nombreCampoAT, enlace)
resultado = []
for datoArchivo, respuesta in zip(datosFila[0], datosFila[1]):
# Paso 2
print("Copiando archivos de "+campoAT+".")
resultado.append(base.upload_bytes_file(datoArchivo["name"], respuesta.content, replace=False))
# Si el nombre del archivo se ha actualizado por haber otro archivo con el mismo nombre, actualizamos en la lista
nuevoNombre = resultado[-1]["name"]
url = datoArchivo["url"]
datoArchivo["url"] = url.replace(datoArchivo["name"], nuevoNombre)
datoArchivo["name"] = nuevoNombre
# Paso 3
info = base.update_row(tabla, idFila, {nombreCampoAT: datosFila[0]})
break # Termina en la primera coincidencia
else: break