函数模块:F4_DATE

本文详细介绍了F4_DATE函数的使用方法,包括其输入参数如DATE_FOR_FIRST_MONTH、DISPLAY等,以及输出参数如SELECT_DATE等。特别说明了如何通过该函数获取日期类型的F4帮助,并解释了各参数的作用。

函数模块:F4_DATE
用这个函数可以获得日期类型字段的 F4 帮助。

输入参数:
DATE_FOR_FIRST_MONTH:初始选中日期
DISPLAY:是否返回选中日期,如果为 'X',则不返回值
FACTORY_CALENDAR_ID:指定一个工厂日历
GREGORIAN_CALENDAR_FLAG:使用格里高利历,不使用工厂日历
HOLIDAY_CALENDAR_ID:指定假期日历
PROGNAME_FOR_FIRST_MONTH:如果不指定 DATE_FOR_FIRST_MONTH 参数,则系统自动获得本参数所指定程序的当前字段的值做为初始日期

输出参数:
SELECT_DATE:选中的日期
SELECT_WEEK
SELECT_WEEK_BEGIN
SELECT_WEEK_END
我测试中后三个输出参数没有获得值

u1804@u1804-Lenovo-Legion-R9000K2021H:~/study/cartographer_install$ ./auto-carto-build.sh [sudo] u1804 的密码: /home/u1804/study/cartographer_install -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Build type: Release 文件 /home/u1804/study/cartographer_install/cartographer/build/AllFiles.cmake 和 - 不同 -- Looking for pthread.h -- Looking for pthread.h - found -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found GMock: /usr/local/lib/libgmock_main.a;/usr/local/lib/libgmock.a;/usr/local/lib/libgtest.a;-lpthread CMake Warning (dev) at /usr/local/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:438 (message): The package name passed to `find_package_handle_standard_args` (Threads) does not match the name of the calling package (absl). This can lead to problems in calling code that expects `find_package` result variables (e.g., `_FOUND`) to follow a certain pattern. Call Stack (most recent call first): /usr/local/share/cmake-3.20/Modules/FindThreads.cmake:238 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) /usr/local/lib/cmake/absl/abslConfig.cmake:3 (include) CMakeLists.txt:32 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. -- Found Boost: /usr/include (found version "1.65.1") found components: iostreams regex -- Found installed version of Eigen: /usr/lib/cmake/eigen3 -- Found required Ceres dependency: Eigen version 3.3.4 in /usr/include/eigen3 -- Found required Ceres dependency: glog -- Found installed version of gflags: /usr/lib/x86_64-linux-gnu/cmake/gflags -- Detected gflags version: 2.2.1 -- Found required Ceres dependency: gflags -- Found Ceres version: 1.13.0 installed in: /usr/local with components: [LAPACK, SuiteSparse, SparseLinearAlgebraLibrary, CXSparse, SchurSpecializations, C++11, OpenMP] CMake Warning (dev) at /usr/local/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:438 (message): The package name passed to `find_package_handle_standard_args` (Lua) does not match the name of the calling package (LuaGoogle). This can lead to problems in calling code that expects `find_package` result variables (e.g., `_FOUND`) to follow a certain pattern. Call Stack (most recent call first): cmake/modules/FindLuaGoogle.cmake:211 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) CMakeLists.txt:41 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. -- Found Lua: /usr/lib/x86_64-linux-gnu/liblua5.2.so;/usr/lib/x86_64-linux-gnu/libm.so (found version "5.2.4") -- Found Protobuf: /usr/local/lib/libprotobuf.a;-lpthread (found suitable version "3.4.0", minimum required is "3.0.0") -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") -- Checking for one of the modules 'cairo>=1.12.16' -- Found Sphinx: /usr/bin/sphinx-build -- Configuring done -- Generating done -- Build files have been written to: /home/u1804/study/cartographer_install/cartographer/build [42/381] cd /home/u1804/study/cartogra...all/cartographer/build/AllFiles.cmake" 文件 /home/u1804/study/cartographer_install/cartographer/build/AllFiles.cmake 和 - 不同 [43/381] Building documentation. Running Sphinx v1.6.7 making output directory... loading pickled environment... not yet created building [mo]: targets for 0 po files that are out of date building [html]: targets for 6 source files that are out of date updating environment: 6 added, 0 changed, 0 removed reading sources... [ 16%] configuration reading sources... [ 33%] cost_functions reading sources... [ 50%] evaluation reading sources... [ 66%] index reading sources... [ 83%] pbstream_migration reading sources... [100%] terminology looking for now-outdated files... none found pickling environment... done checking consistency... done preparing documents... done writing output... [ 16%] configuration writing output... [ 33%] cost_functions writing output... [ 50%] evaluation writing output... [ 66%] index writing output... [ 83%] pbstream_migration writing output... [100%] terminology generating indices... genindex writing additional pages... search copying images... [ 50%] high_level_system_overview.png copying images... [100%] autogenerate_groundtruth.png copying static files... done copying extra files... done dumping search index in English (code: en) ... done dumping object inventory... done build succeeded. [265/381] Linking CXX executable cartographer_print_configuration FAILED: cartographer_print_configuration : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o -o cartographer_print_configuration libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘cartographer::common::PrintSubdictionaryById(cartographer::common::LuaParameterDictionary*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中: print_configuration_main.cc:(.text+0x2c3):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text+0x84d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty>::ConvertToContainer<std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > >, std::basic_string_view<char, std::char_traits<char> >, false>::operator()(absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty> const&) const’中: print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x105):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x20d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 collect2: error: ld returned 1 exit status [266/381] Linking CXX executable cartographer_pbstream FAILED: cartographer_pbstream : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_pbstream.dir/cartographer/io/pbstream_main.cc.o -o cartographer_pbstream libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : libcartographer.a(histogram.cc.o):在函数‘cartographer::common::Histogram::ToString[abi:cxx11](int) const’中: histogram.cc:(.text+0x3f4):对‘absl::strings_internal::CatPieces[abi:cxx11](std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 histogram.cc:(.text+0xb60):对‘absl::strings_internal::AppendPieces(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 collect2: error: ld returned 1 exit status [282/381] Building CXX object CMakeFiles/car...nal/3d/local_trajectory_builder_3d_test.cc.o ninja: build stopped: subcommand failed. [2/104] Linking CXX executable cartographer_print_configuration FAILED: cartographer_print_configuration : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o -o cartographer_print_configuration libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘cartographer::common::PrintSubdictionaryById(cartographer::common::LuaParameterDictionary*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中: print_configuration_main.cc:(.text+0x2c3):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text+0x84d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty>::ConvertToContainer<std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > >, std::basic_string_view<char, std::char_traits<char> >, false>::operator()(absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty> const&) const’中: print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x105):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x20d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 collect2: error: ld returned 1 exit status [3/104] Linking CXX executable cartographer.transform.rigid_transform_test FAILED: cartographer.transform.rigid_transform_test : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o -o cartographer.transform.rigid_transform_test libcartographer.a /usr/local/lib/libgmock_main.a /usr/local/lib/libgmock.a /usr/local/lib/libgtest.a -lpthread libcartographer_test_library.a libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread /usr/local/lib/libgmock.a && : CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘std::ostream& cartographer::transform::operator<< <double>(std::ostream&, cartographer::transform::Rigid2<double> const&)’中: rigid_transform_test.cc:(.text._ZN12cartographer9transformlsIdEERSoS2_RKNS0_6Rigid2IT_EE[_ZN12cartographer9transformlsIdEERSoS2_RKNS0_6Rigid2IT_EE]+0x110):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘std::ostream& cartographer::transform::operator<< <float>(std::ostream&, cartographer::transform::Rigid2<float> const&)’中: rigid_transform_test.cc:(.text._ZN12cartographer9transformlsIfEERSoS2_RKNS0_6Rigid2IT_EE[_ZN12cartographer9transformlsIfEERSoS2_RKNS0_6Rigid2IT_EE]+0x11c):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::Rigid3<double>::DebugString[abi:cxx11]() const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform6Rigid3IdE11DebugStringB5cxx11Ev[_ZNK12cartographer9transform6Rigid3IdE11DebugStringB5cxx11Ev]+0x20f):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::Rigid3<float>::DebugString[abi:cxx11]() const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform6Rigid3IfE11DebugStringB5cxx11Ev[_ZNK12cartographer9transform6Rigid3IfE11DebugStringB5cxx11Ev]+0x22b):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::IsNearlyMatcherP2<cartographer::transform::Rigid2<float>, float>::gmock_Impl<cartographer::transform::Rigid2<float> const&>::FormatDescription[abi:cxx11](bool) const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IfEEfE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb[_ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IfEEfE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb]+0x17f):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:rigid_transform_test.cc:(.text._ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IdEEdE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb[_ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IdEEdE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb]+0x173): 跟着更多未定义的参考到 absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long) collect2: error: ld returned 1 exit status [4/104] Linking CXX executable cartographer_pbstream FAILED: cartographer_pbstream : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_pbstream.dir/cartographer/io/pbstream_main.cc.o -o cartographer_pbstream libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : libcartographer.a(histogram.cc.o):在函数‘cartographer::common::Histogram::ToString[abi:cxx11](int) const’中: histogram.cc:(.text+0x3f4):对‘absl::strings_internal::CatPieces[abi:cxx11](std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 histogram.cc:(.text+0xb60):对‘absl::strings_internal::AppendPieces(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 collect2: error: ld returned 1 exit status [19/104] Building CXX object CMakeFiles/cart...unctions/landmark_cost_function_3d_test.cc.o ninja: build stopped: subcommand failed. u1804@u1804-Lenovo-Legion-R9000K2021H:~/study/cartographer_install$
08-21
REPORT Z_XTT_FILE_BROWSER. DATA: V_FILE_PATH TYPE STRING, V_DIR_PATH TYPE STRING. PARAMETERS: P_FILE TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY, P_DIR TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: RB_FILE RADIOBUTTON GROUP GR1 DEFAULT 'X', RB_DIR RADIOBUTTON GROUP GR1. SELECTION-SCREEN END OF BLOCK B1. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM FRM_GET_FILE_PATH. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DIR. PERFORM FRM_GET_DIR_PATH. FORM FRM_GET_FILE_PATH. DATA: LIT_FILES TYPE FILETABLE, LWA_FILE TYPE FILE_TABLE, V_RC TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'Select File' DEFAULT_EXTENSION = '*.*' MULTISELECTION = ABAP_FALSE CHANGING FILE_TABLE = LIT_FILES RC = V_RC EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF SY-SUBRC = 0 AND V_RC = 1. READ TABLE LIT_FILES INTO LWA_FILE INDEX 1. IF SY-SUBRC = 0. P_FILE = LWA_FILE-FILENAME. ENDIF. ENDIF. ENDFORM. FORM FRM_GET_DIR_PATH. DATA: V_DIR TYPE STRING. CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE EXPORTING WINDOW_TITLE = 'Select Directory' INITIAL_FOLDER = 'C:\' CHANGING SELECTED_FOLDER = V_DIR EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4. IF SY-SUBRC = 0. P_DIR = V_DIR. ENDIF. ENDFORM. START-OF-SELECTION. IF RB_FILE = 'X'. V_FILE_PATH = P_FILE. WRITE: / 'Selected File:', V_FILE_PATH. ELSE. V_DIR_PATH = P_DIR. WRITE: / 'Selected Directory:', V_DIR_PATH. ENDIF. ### 问题: 如何创建一个SAP接口来获取国家特定的数字格式、日期格式和时间格式设置,包括可选的相关描述信息? ### 代码: REPORT ZGET_COUNTRY_FORMATS. TABLES: T005X. TYPES: BEGIN OF TY_COUNTRY_FORMAT, LAND1 TYPE T005X-LAND1, NUMCO TYPE T005X-NUMCO, DATFM TYPE T005X-DATFM, TIMEFM TYPE T005X-TIMEFM, LANDX TYPE T005X-LANDX, DATFMTXT TYPE T005X-DATFMTXT, TIMEFMTXT TYPE T005X-TIMEFMTXT, END OF TY_COUNTRY_FORMAT. DATA: IT_COUNTRY_FORMATS TYPE STANDARD TABLE OF TY_COUNTRY_FORMAT, WA_COUNTRY_FORMAT TYPE TY_COUNTRY_FORMAT. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: P_LAND1 TYPE T005X-LAND1 OBLIGATORY. SELECT-OPTIONS: S_NUMCO FOR T005X-NUMCO. PARAMETERS: CB_DESC AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK B1. START-OF-SELECTION. PERFORM FRM_GET_COUNTRY_FORMATS. FORM FRM_GET_COUNTRY_FORMATS. SELECT LAND1 NUMCO DATFM TIMEFM LANDX DATFMTXT TIMEFMTXT FROM T005X INTO TABLE IT_COUNTRY_FORMATS WHERE LAND1 = P_LAND1 AND NUMCO IN S_NUMCO. IF CB_DESC = 'X'. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM, / 'Country Name:', WA_COUNTRY_FORMAT-LANDX, / 'Date Format Desc:', WA_COUNTRY_FORMAT-DATFMTXT, / 'Time Format Desc:', WA_COUNTRY_FORMAT-TIMEFMTXT. ENDLOOP. ELSE. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM. ENDLOOP. ENDIF. ENDFORM. 上面代码用了CLASS,把他改成不用CLASS的方法
07-11
我朋友对你的回复如下: 答案 2 ("修复"的 V2 答案): 这个答案是 100% 错误的,它会让你再次 404。 它的核心论点是:"你用的URL是 .../styles_batch_update,而正确的URL是 .../styles_batch_update。" —— 这两串地址一模一样! 它建议你使用的 API_V2_STYLE_URL 就是你现在这个 404 错误的 URL。 虽然它提到的 V2 Payload 结构 {"data": [...]} 可能是对的(你用的是 {"styleRanges": [...]}),但这根本不重要,因为你的 404 错误发生在 URL 层面,服务器根本没去看你的 Payload 就报错了。 我现在的代码如下: import os import json import requests import sys from typing import Dict, Any, List, Tuple, Set, Optional import urllib.parse import time import datetime import re from dotenv import load_dotenv from collections import defaultdict # === 辅助工具 === class Timer: def __init__(self): self._start = None def start(self): self._start = time.perf_counter() def stop(self, msg=""): if self._start: print(f" - [计时] {msg}耗时: {time.perf_counter() - self._start:.4f}s"); self._start = None # --- 加载配置 --- try: script_dir = os.path.dirname(os.path.realpath(__file__)) except: script_dir = os.path.abspath(os.getcwd()) dotenv_path = os.path.join(script_dir, '.env') load_dotenv(dotenv_path) if os.path.exists(dotenv_path) else None APP_ID = os.getenv("APP_ID") APP_SECRET = os.getenv("APP_SECRET") SPREADSHEET_TOKEN = os.getenv("SPREADSHEET_TOKEN") REDIRECT_URI = os.getenv("REDIRECT_URI", "http://localhost:8080/auth") TOKEN_FILE = "feishu_token.json" # 列配置 ATTR_COL = os.getenv("ATTRIBUTE_COL", "B") # (新) 属性列 NAME_COL = os.getenv("MATERIAL_NAME_COL", "A") # 物料名称 S1_CODE_COL = os.getenv("SUPPLIER_1_CODE_COL", "C") S1_SUP_COL = os.getenv("SUPPLIER_1_SUPPLIER_COL", "D") S2_CODE_COL = os.getenv("SUPPLIER_2_CODE_COL", "E") S2_SUP_COL = os.getenv("SUPPLIER_2_SUPPLIER_COL", "F") START_ROW = int(os.getenv("START_ROW", "2")) END_ROW = int(os.getenv("END_ROW", "500")) SUMMARY_SHEET_NAME = os.getenv("SUMMARY_SHEET_NAME", "零部件比对汇总(新)") # === 1. 认证模块 (保持不变) === def save_token(data): try: with open(os.path.join(script_dir, TOKEN_FILE), 'w') as f: json.dump(data, f, indent=4) except Exception as e: print(f"Error saving token: {e}") def load_token(): path = os.path.join(script_dir, TOKEN_FILE) if not os.path.exists(path): return {} try: with open(path, 'r') as f: d = json.load(f) if 'expires_at' in d: d['expires_at'] = datetime.datetime.fromisoformat(d['expires_at']) return d except: return {} def get_access_token(): data = load_token() if data.get("access_token") and data.get("expires_at", datetime.datetime.min) > datetime.datetime.now(): return data["access_token"] if data.get("refresh_token"): try: url = "https://open.feishu.cn/open-apis/authen/v2/oauth/token" resp = requests.post(url, json={"grant_type": "refresh_token", "client_id": APP_ID, "client_secret": APP_SECRET, "refresh_token": data["refresh_token"]}) resp.raise_for_status() res = resp.json() if res.get("code") == 0: new_data = {"access_token": res["access_token"], "refresh_token": res["refresh_token"], "expires_at": (datetime.datetime.now() + datetime.timedelta(seconds=res["expires_in"]-300)).isoformat()} save_token({**new_data, "expires_at": new_data["expires_at"]}) return res["access_token"] except: pass scope = "sheets:spreadsheet sheets:spreadsheet:read sheets:spreadsheet:write_only sheets:spreadsheet.meta:read sheets:spreadsheet.meta:write" url = f"https://accounts.feishu.cn/open-apis/authen/v1/authorize?client_id={APP_ID}&response_type=code&redirect_uri={urllib.parse.quote(REDIRECT_URI)}&scope={scope}" print(f"请打开链接授权:\n{url}") code = input("请输入Code: ").strip() resp = requests.post("https://open.feishu.cn/open-apis/authen/v2/oauth/token", json={ "grant_type": "authorization_code", "client_id": APP_ID, "client_secret": APP_SECRET, "code": code, "redirect_uri": REDIRECT_URI}) res = resp.json() if res.get("code") != 0: raise Exception(f"Auth failed: {res}") token_data = {"access_token": res["access_token"], "refresh_token": res.get("refresh_token"), "expires_at": (datetime.datetime.now() + datetime.timedelta(seconds=res["expires_in"]-300)).isoformat()} save_token(token_data) return res["access_token"] # === 2. 飞书 API 基础操作 === def call_api(method, url, json_data=None, params=None): token = get_access_token() headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json; charset=utf-8"} resp = requests.request(method, url, headers=headers, json=json_data, params=params) resp.raise_for_status() res = resp.json() if res.get("code", 0) != 0: raise Exception(f"API Error: {res}") return res def get_sheet_id_by_name(sp_token, name): res = call_api("GET", f"https://open.feishu.cn/open-apis/sheets/v3/spreadsheets/{sp_token}/sheets/query") for sheet in res["data"]["sheets"]: if sheet["title"] == name: return sheet["sheet_id"] return None def create_sheet(sp_token, name): exist = get_sheet_id_by_name(sp_token, name) if exist: return exist # create_sheet 仍然使用 .../sheets_batch_update (这没错, V2的批量更新) res = call_api("POST", f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{sp_token}/sheets_batch_update", json_data={"requests": [{"addSheet": {"properties": {"title": name}}}]}) return res["data"]["replies"][0]["addSheet"]["properties"]["sheetId"] def read_range(sp_token, sheet_id, col, s_row, e_row): rng = f"{sheet_id}!{col}{s_row}:{col}{e_row}" # read_range 使用 .../values_batch_get (这也没错, V2的读取) res = call_api("GET", f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{sp_token}/values_batch_get", params={"ranges": rng}) vals = res["data"]["valueRanges"][0]["values"] result = [] for i, row in enumerate(vals): val = "" if row: cell = row[0] if isinstance(cell, dict): val = cell.get("text", "") else: val = str(cell) result.append({"row": s_row + i, "val": val.strip()}) return result # === 3. 工具函数:(保持不变) === def _col_str_to_idx(col_str: str) -> int: idx = 0 for char in col_str: idx = idx * 26 + (ord(char) - ord('A')) + 1 return idx - 1 def parse_range(range_str: str) -> Dict[str, Any]: try: sheet_id, coords = range_str.split('!') match = re.match(r"([A-Z]+)(\d+):([A-Z]+)(\d+)", coords) if match: start_col_str, start_row_str, end_col_str, end_row_str = match.groups() start_row_idx = int(start_row_str) - 1 end_row_idx = int(end_row_str) start_col_idx = _col_str_to_idx(start_col_str) end_col_idx = _col_str_to_idx(end_col_str) + 1 else: match_single = re.match(r"([A-Z]+)(\d+)", coords) if not match_single: raise ValueError(f"Invalid range coordinate format: {coords}") col_str, row_str = match_single.groups() start_row_idx = int(row_str) - 1 end_row_idx = start_row_idx + 1 start_col_idx = _col_str_to_idx(col_str) end_col_idx = start_col_idx + 1 return { "sheetId": sheet_id, "startRowIndex": start_row_idx, "endRowIndex": end_row_idx, "startColumnIndex": start_col_idx, "endColumnIndex": end_col_idx } except Exception as e: print(f"ERROR: 解析范围字符串 '{range_str}' 失败: {e}") return {} def num_to_col_char(n): string = "" while n > 0: n, remainder = divmod(n - 1, 26) string = chr(65 + remainder) + string return string # === 4. 核心逻辑:数据抓取与对齐 (保持不变) === ProjectData = Dict[str, Dict[str, Tuple[str, str]]] def fetch_all_data(sp_token, sheets): aligned_data = defaultdict(lambda: {"attr": "", "projects": {}}) for sheet in sheets: title, sid = sheet["title"], sheet["sheet_id"] print(f" - 读取项目: {title} ...") names = read_range(sp_token, sid, NAME_COL, START_ROW, END_ROW) attrs = read_range(sp_token, sid, ATTR_COL, START_ROW, END_ROW) s1_codes = read_range(sp_token, sid, S1_CODE_COL, START_ROW, END_ROW) s1_sups = read_range(sp_token, sid, S1_SUP_COL, START_ROW, END_ROW) s2_codes = read_range(sp_token, sid, S2_CODE_COL, START_ROW, END_ROW) s2_sups = read_range(sp_token, sid, S2_SUP_COL, START_ROW, END_ROW) for i in range(len(names)): name = names[i]["val"] if not name: continue attr = attrs[i]["val"] if i < len(attrs) else "" s1_c = s1_codes[i]["val"] if i < len(s1_codes) else "" s1_s = s1_sups[i]["val"] if i < len(s1_sups) else "" s2_c = s2_codes[i]["val"] if i < len(s2_codes) else "" s2_s = s2_sups[i]["val"] if i < len(s2_sups) else "" if not aligned_data[name]["attr"] and attr: aligned_data[name]["attr"] = attr aligned_data[name]["projects"][title] = { "s1": (s1_s, s1_c), # (供应商, 料号) "s2": (s2_s, s2_c) } return aligned_data def main(): print("=== 开始执行:多项目零部件比对与样式生成 ===") # 1. 获取所有 Sheet all_sheets_meta = call_api("GET", f"https://open.feishu.cn/open-apis/sheets/v3/spreadsheets/{SPREADSHEET_TOKEN}/sheets/query")["data"]["sheets"] valid_sheets = [s for s in all_sheets_meta if s["title"] != SUMMARY_SHEET_NAME] print("发现以下项目:") for i, s in enumerate(valid_sheets): print(f" [{i+1}] {s['title']}") sel_idx = input("请输入要比对的项目序号 (如 1,2,3 或 all): ").strip() if sel_idx.lower() == "all": selected = valid_sheets else: selected = [valid_sheets[int(x)-1] for x in sel_idx.split(",") if x.strip().isdigit()] if len(selected) < 2: print("至少选择两个项目!"); return proj_names = [s["title"] for s in selected] # 2. 读取并对齐数据 timer = Timer() timer.start() data_map = fetch_all_data(SPREADSHEET_TOKEN, selected) timer.stop("数据读取与对齐") # 3. 准备写入数据矩阵 sorted_names = sorted(data_map.keys()) matrix = [] # --- 构建表头行 --- row1 = ["项目", "属性"] for p in proj_names: row1.extend([p, "", "", ""]) matrix.append(row1) row2 = ["", ""] for _ in proj_names: row2.extend(["一供", "", "二供", ""]) matrix.append(row2) row3 = ["物料名称", ""] for _ in proj_names: row3.extend(["供应商", "物料料号", "供应商", "物料料号"]) matrix.append(row3) # --- 构建数据行与样式计算 --- COLOR_GREEN = "#b7e1cd" COLOR_RED = "#f4c7c3" green_cells = [] red_cells = [] current_row_idx = 4 for name in sorted_names: item = data_map[name] attr = item["attr"] row_data = [name, attr] pair_counts = defaultdict(int) for p_name in proj_names: p_data = item["projects"].get(p_name, {"s1":("",""), "s2":("","")}) s1 = p_data["s1"] s2 = p_data["s2"] if s1[0] and s1[1]: pair_counts[s1] += 1 if s2[0] and s2[1]: pair_counts[s2] += 1 col_idx = 3 for p_name in proj_names: p_data = item["projects"].get(p_name, {"s1":("",""), "s2":("","")}) s1 = p_data["s1"] s2 = p_data["s2"] row_data.extend([s1[0], s1[1]]) if s1[0] and s1[1]: cell_sup = f"{num_to_col_char(col_idx)}{current_row_idx}" cell_code = f"{num_to_col_char(col_idx+1)}{current_row_idx}" if pair_counts[s1] > 1: green_cells.extend([cell_sup, cell_code]) else: red_cells.extend([cell_sup, cell_code]) col_idx += 2 row_data.extend([s2[0], s2[1]]) if s2[0] and s2[1]: cell_sup = f"{num_to_col_char(col_idx)}{current_row_idx}" cell_code = f"{num_to_col_char(col_idx+1)}{current_row_idx}" if pair_counts[s2] > 1: green_cells.extend([cell_sup, cell_code]) else: red_cells.extend([cell_sup, cell_code]) col_idx += 2 matrix.append(row_data) current_row_idx += 1 # 4. 写入表格 timer.start() sum_sid = create_sheet(SPREADSHEET_TOKEN, SUMMARY_SHEET_NAME) print(f"目标Sheet: {SUMMARY_SHEET_NAME} (ID: {sum_sid})") if matrix and len(matrix) > 0: num_rows = len(matrix) num_cols = len(matrix[0]) end_col_letter = num_to_col_char(num_cols) full_range = f"{sum_sid}!A1:{end_col_letter}{num_rows}" print(f" - GangZaiXieRuFanWei: {full_range} ...") call_api("PUT", f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values", json_data={"valueRange": {"range": full_range, "values": matrix}}) else: print(" - 警告: 没有数据需要写入。") print(" - 数据写入完成") # 5. 准备合并请求 print(" - 正在准备单元格合并 (表头)...") merge_list = [] merge_list.append(f"{sum_sid}!A1:A2") # 项目 (FIX: A1:A2, 之前是 A1:A3) merge_list.append(f"{sum_sid}!B1:B3") # 属性 current_col = 3 # C列 for _ in proj_names: start = num_to_col_char(current_col) end = num_to_col_char(current_col + 3) merge_list.append(f"{sum_sid}!{start}1:{end}1") # Proj Name s1_start = num_to_col_char(current_col) s1_end = num_to_col_char(current_col + 1) merge_list.append(f"{sum_sid}!{s1_start}2:{s1_end}2") # 一供 s2_start = num_to_col_char(current_col + 2) s2_end = num_to_col_char(current_col + 3) merge_list.append(f"{sum_sid}!{s2_start}2:{s2_end}2") # 二供 current_col += 4 # ★★★ 使用专用的 .../merge_cells API (V2, 这个没问题) ★★★ API_V2_MERGE_URL = f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/merge_cells" if merge_list: print(f" - 正在批量执行 {len(merge_list)} 个合并请求...") # 这个接口不是批量的,我们必须循环调用 for rng_str in merge_list: payload = { "range": rng_str, # A1 字符串格式,带 sheetId "mergeType": "MERGE_ALL" } try: call_api("POST", API_V2_MERGE_URL, json_data=payload) except Exception as e: print(f"WARN: 合并 {rng_str} 失败: {e}") print(" - 表头合并完成") # 6. 准备上色请求 print(f" - 正在准备应用样式 (红: {len(red_cells)/2}组, 绿: {len(green_cells)/2}组)...") # ★★★ 核心修复: 切换到 V3 API ★★★ # V3 接口的 URL 包含 sheet_id (sum_sid) # 这将替换掉 404 的 V2 .../styles_batch_update 接口 API_V3_STYLE_URL = f"https://open.feishu.cn/open-apis/sheets/v3/spreadsheets/{SPREADSHEET_TOKEN}/sheets/{sum_sid}/batch_update_style" style_requests = [] if red_cells or green_cells: color_map = {} if red_cells: color_map[COLOR_RED] = red_cells if green_cells: color_map[COLOR_GREEN] = green_cells # 构造 V3 payload for color, cells in color_map.items(): for cell in cells: style_requests.append({ "range": cell, # V3 的 range 不带 sheet_id! 前缀 (修复点 1) "style": {"backColor": color} }) if style_requests: print(f" - 正在批量执行 {len(style_requests)} 个样式请求...") chunk_size = 100 # V3 API 批次限制通常比 100 高,但 100 绝对安全 for i in range(0, len(style_requests), chunk_size): chunk = style_requests[i:i + chunk_size] print(f" - 正在提交样式批次 {i//chunk_size + 1}/{ (len(style_requests) // chunk_size) + 1 }...") # 构造正确的 V3 payload (修复点 2) payload = {"requests": chunk} call_api("POST", API_V3_STYLE_URL, # 使用 V3 URL json_data=payload) # 使用 V3 payload else: print(" - 没有样式需要更新。") timer.stop("写入、合并与上色") print("任务完成!请查看飞书文档。") if __name__ == "__main__": try: main() except Exception as e: import traceback traceback.print_exc() print(f"Error: {e}") 运行后报错如下: 目标Sheet: R500C&R510超薄&R520半包物料差异比对-2 (ID: lUYLu) - GangZaiXieRuFanWei: lUYLu!A1:N72 ... - 数据写入完成 - 正在准备单元格合并 (表头)... - 正在批量执行 11 个合并请求... - 表头合并完成 - 正在准备应用样式 (红: 87.0组, 绿: 227.0组)... - 正在批量执行 628 个样式请求... - 正在提交样式批次 1/7... Traceback (most recent call last): File "D:\python-code\PROJECT-DATE\关键零部件清单差异化比对\关键零部件清单差异化比对-格式优化2.py", line 419, in <module> try: main() ^^^^^^ File "D:\python-code\PROJECT-DATE\关键零部件清单差异化比对\关键零部件清单差异化比对-格式优化2.py", line 410, in main call_api("POST", API_V3_STYLE_URL, # 使用 V3 URL File "D:\python-code\PROJECT-DATE\关键零部件清单差异化比对\关键零部件清单差异化比对-格式优化2.py", line 97, in call_api resp.raise_for_status() File "C:\Program Files\Python311\Lib\site-packages\requests\models.py", line 1026, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://open.feishu.cn/open-apis/sheets/v3/spreadsheets/EYRysBZWkhbA4vts3yLcwitNn1g/sheets/lUYLu/batch_update_style Error: 404 Client Error: Not Found for url: https://open.feishu.cn/open-apis/sheets/v3/spreadsheets/EYRysBZWkhbA4vts3yLcwitNn1g/sheets/lUYLu/batch_update_style 进程已结束,退出代码为 0
最新发布
11-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值