Add-on Konverter Makro mengotomatiskan sebagian besar proses konversi, tetapi Anda mungkin perlu melakukan penyesuaian pada beberapa API dan item lainnya untuk menyelesaikan kode.
Gunakan panduan ini untuk memahami file Apps Script (file GS) yang ditambahkan ke project Anda, menafsirkan berbagai jenis error, dan mempelajari cara memperbaiki error.
Memahami file Apps Script yang ditambahkan ke project Anda
File GS tambahan ditambahkan ke project Apps Script Anda untuk membantu:
- Menentukan konstanta dan nilai VBA yang tidak ada di Apps Script.
- Terapkan API yang belum dikonversi.
- Menyelesaikan varian.
File GS berikut ditambahkan ke project Apps Script Anda:
Library.gs
Unimplemented_constructs.gs
Variant_resolutions.gs
Library.gs
Secara umum, Anda tidak perlu mengubah apa pun dalam file library.gs
.
File library.gs
menentukan fungsi dan konstanta yang digunakan dalam kode VBA
Anda yang tidak ada di Apps Script. Hal ini membantu kode Apps Script baru lebih menyerupai kode VBA Anda. Selain itu, Anda tidak perlu mengulangi definisi setiap kali fungsi atau konstanta dari file library.gs
digunakan.
Unimplemented_constructs.gs
File unimplemented_constructs.gs
menangani konstruksi atau API yang tidak dapat
dikonversi oleh Macro Converter. Anda mungkin perlu mengubah file ini agar
kode berfungsi sebagaimana mestinya.
Contoh: Window.Activate()
Berikut adalah contoh API yang tidak didukung yang disebut Window.Activate()
.
Konverter Makro membuat fungsi Apps Script baru dengan nama yang mirip dan menentukannya dalam file unimplemented_constructs.gs
. Karena fungsi VBA
tidak didukung, fungsi Apps Script baru akan menampilkan pengecualian.
Fungsi baru ditambahkan ke kode Apps Script yang dikonversi di mana saja API asli digunakan dalam kode VBA.
Jika menemukan solusi untuk membuat ulang perilaku API asli, Anda hanya perlu memperbarui definisi fungsi dalam file unimplemented_constructs.gs
. Setelah ditentukan di sana, fungsi tersebut akan berlaku di mana pun fungsi tersebut muncul dalam project Apps Script Anda.
Berikut adalah contoh dalam kode:
Kode VBA asli
Window.activate()
Kode Apps Script yang dikonversi, ditambahkan secara inline
_api_window_activate();
Definisi fungsi ditambahkan ke file unimplemented_constructs.gs
/** * Could not convert window.activate API. Please add relevant code in the * following function to implement it. * This API has been used at the following locations in the VBA script. * module1 : line 3 * * We couldn't find an equivalent API in Apps Script for this VBA API. Please * reconsider if this function call is critical, otherwise consider implementing * it in a different way. */ function _api_window_activate(CallingObject) { ThrowException("API window.activate not supported yet."); }
Variant_resolutions.gs
File variant_resolutions.gs
ditambahkan ke project Apps Script Anda jika jenis objek tidak dapat ditentukan. Hal ini dapat terjadi karena beberapa alasan, seperti
API yang memiliki beberapa jenis nilai yang ditampilkan atau objek dideklarasikan sebagai varian
itu sendiri.
Konverter Makro menambahkan fungsi baru ke file ini yang disebut __handle_resolve_<api>()
yang menggantikan API yang dimaksud dan membantu menentukan jenis objek.
Dalam beberapa kasus, Anda mungkin perlu memperbarui fungsi __handle_resolve_<api>()
untuk mendeklarasikan jenis objek secara manual. Lihat Jenis objek yang tidak didukung.
Contoh: name()
Banyak jenis objek di VBA menentukan name()
API. Biasanya, yang setara dengan Apps Script
adalah getName()
, tetapi tidak untuk setiap jenis objek. Beberapa kasus
alternatif dapat terjadi:
- API yang setara dengan objek disebut dengan nama yang berbeda dari
getName()
. - Objek tidak memiliki Apps Script API untuk mendapatkan namanya.
- Tidak ada objek Apps Script yang setara.
Jika jenis objek tidak ditentukan, Konverter Makro akan membuat fungsi baru
yang disebut __handle_resolve_name
dalam file variant_resolutions.gs
.
Berikut adalah contoh dalam kode:
Kode VBA asli
a = Selection.name
Dalam hal ini, API name()
dipanggil pada pilihan saat ini. Pilihan
dapat berupa objek Sheet atau objek Shape. Jika objeknya adalah objek Sheet, terjemahannya adalah getName()
, tetapi jika objeknya adalah objek Shape, tidak ada yang setara
di Apps Script.
Kode Apps Script yang dikonversi, ditambahkan secara inline
a = __handle_resolve_name({}, getActiveSelection(), {});
Fungsi __handle_resolve_name()
di bawah ditambahkan ke
file variant_resolution.gs
untuk menyelesaikan berbagai jenis objek. Fungsi ini
memeriksa jenis objek, lalu menggunakan getName()
jika didukung, atau menampilkan
error jika getName()
tidak didukung.
Definisi fungsi ditambahkan ke file variant_resolution.gs
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (!found_api_variant) { ThrowException("API.name not supported yet." ); } return return_value; }
Menemukan error
Saat Anda mengalami error dalam kode Apps Script yang dikonversi, pesan tersebut akan menentukan jenis error dan lokasinya. Format pesan error bergantung pada runtime Apps Script yang Anda gunakan.
Jika berada di runtime V8 default, Anda akan melihat error yang terlihat seperti berikut:
_api_windows_active (unimplemented_constructs:2:3)
Artinya, error terletak di file unimplemented_constructs.gs
pada baris
2, karakter 3.
Jika Anda menggunakan runtime Rhino yang tidak digunakan lagi, Anda akan melihat error yang terlihat seperti berikut:
unimplemented_constructs:2 (_api_windows_active)
Artinya, error terletak di file unimplemented_constructs.gs
pada
baris 2.
Jenis Error
Anda dapat memperbaiki sebagian besar error yang Anda alami dalam file unimplemented_constructs.gs
dan variant_resolution.gs
yang dijelaskan di atas.
Jenis error yang mungkin Anda temui mencakup:
- API yang tidak diimplementasikan
- Konstruksi bahasa yang tidak diterapkan
- API yang didukung sebagian
- Perlu pekerjaan manual
- Error yang Disengaja
API yang Tidak Diimplementasikan
API yang tidak diterapkan adalah API yang tidak dapat dikonversi oleh Konverter Makro dari VBA ke Apps Script dan tidak ada solusi yang diketahui untuk API tersebut.
API yang tidak diimplementasikan biasanya ditambahkan sebagai fungsi kosong—terkadang dengan tanda tangan
kosong—ke file unimplemented_constructs.gs
. Jika jenis objek
tidak dapat ditentukan, API yang tidak diimplementasikan dapat ditambahkan ke
file variant_resolution.gs
.
Dalam laporan kompatibilitas yang Anda buat sebelum konversi, API ini diberi label Perlu lebih banyak investigasi.
Jika Anda tidak memperbaiki jenis API ini dalam kode VBA sebelum mengonversi file, berikut tampilannya di project Apps Script:
/** * Could not convert. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. *: * We couldn't find an equivalent API in Apps Script for this VBA API. Please * reconsider if this function call is critical, otherwise consider implementing * it in a different way. * @param param1 {} * @param param2 {} * ... * @return {} */ function _api_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Memperbaiki error API yang tidak diterapkan
Tentukan API yang belum diimplementasikan dengan library JS atau API Apps Script yang ada. Untuk melakukannya, ikuti langkah-langkah ini:
- Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
- Di atas fungsi, baca komentar yang ditambahkan. Dalam beberapa kasus, komentar menyarankan cara menerapkan API di Apps Script.
- Jika Anda tidak dapat menemukan cara untuk menerapkan API di Apps Script, pertimbangkan untuk menghapusnya dari kode Anda.
- Jika Anda tidak dapat menemukan solusi atau menghapus API ini dari kode dan makro Anda menampilkan error ini, Anda tidak dapat mengonversi makro ini.
Contoh error API yang tidak diterapkan
Berikut adalah contoh skenario API yang tidak diterapkan dan cara memperbaikinya:
- Tidak ada Apps Script yang setara:
Menampilkan solusi tidak langsung untuk
Chart.Protect
, API yang tidak ada di Apps Script. - Jenis objek yang tidak diketahui: Menunjukkan cara menangani jenis objek yang merupakan variabel, dan cara menerapkan jenis objek yang tidak didukung yang dapat dibuat ulang di Apps Script.
Contoh 1: Tidak ada Apps Script yang setara atau API yang tidak dikenal
Dalam contoh ini, Chart.Protect
tidak dikonversi secara otomatis karena tidak ada cara untuk melindungi diagram di Google Spreadsheet.
/** * Could not convert chart.protect API. Please add relevant code in the following * function to implement it. * * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * You can use the following Apps Script APIs to convert it. * * Comments : Auto conversion of Chart.Protect is not supported yet. If the API is * critical for the workflow the user can implement the unimplemented handler * method in the generated code, else comment out the throw statement. * * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} Password * @param {boolean} DrawingObjects * @param {boolean} Contents * @param {boolean} Scenarios * @param {boolean} UserInterfaceOnly * */ function _api_chart_protect( CallingObject, Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) { ThrowException('API chart.protect not supported yet.'); }
Contoh implementasi perlindungan rentang ditampilkan di bawah ini:
/** * Could not convert chart.protect API. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * * You can use the following Apps Script APIs to convert it. * Comments : Auto conversion of Chart.Protect is not supported yet. If the API * is critical for the workflow the user can implement the unimplemented handler * method in the generated code, else comment out the throw statement. * * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} Password * @param {boolean} DrawingObjects * @param {boolean} Contents * @param {boolean} Scenarios * @param {boolean} UserInterfaceOnly */ function _api_chart_protect( CallingObject, Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) { var ranges = CallingObject.getChart().getRanges(); for (var i = 0; i < ranges.length; i++) { // Note that this does not lock the range for the document owner. ranges[i].protect(); } }
Contoh 2: Jenis objek tidak didukung
Jika jenis objek tidak diketahui, error API yang tidak diterapkan akan ditambahkan ke file variant_resolution.gs
. Contoh berikut memperluas contoh VBA name()
API di atas. Lihat variant_resolution.gs
.
Dalam contoh ini, Anda akan mempelajari:
- Cara
name()
API dikonversi menjadi fungsi baru dalam filevariant_resolution.gs
. - Cara fungsi baru dipanggil dalam kode yang dikonversi.
- Cara membuat solusi untuk
CommandBar
, jenis objek yang tidak didukung, di Apps Script.
1. Karena kode yang dikonversi tidak dapat menentukan jenis objek yang tepat yang dipanggil oleh name()
, Konverter Makro akan membuat fungsi baru yang disebut __handle_resolve_name
, yang ditampilkan di bawah.
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (!found_api_variant) { ThrowException('API.name not supported yet.' ); } return return_value; }
2. Misalkan kode VBA menentukan fungsi PrintName()
yang memanggil API
name()
. Kode VBA ditampilkan di bawah ini:
‘Defining a function that prints the name of the object in parameter Sub PrintName(obj as Variant) Debug.Print obj.Name End Sub
function PrintName(obj) { Logger.log(_handle_resolve_name(obj)); }
3. Misalnya, kode VBA Anda memanggil fungsi PrintName()
pada jenis objek
CommandBar
. Kode VBA ditampilkan di bawah ini:
PrintName Application.CommandBars.item("Standard")
CommandBar
tidak didukung di Apps Script dan akibatnya, dua
metode yang digunakan dalam kode VBA di atas juga tidak didukung.
Application.CommandBars()
: Di VBA, tindakan ini akan menampilkan daftar semua objekCommandBar
.CommandBars.item()
: Di VBA, tindakan ini akan menampilkan objekCommandBar
tertentu.
_api_application_commandbars()
_api_commandbars_item()
PrintName(_api_commandbars_item(_api_application_commandbars(), "Standard"))) Here’s how the new functions are added to the unimplemented_construct.gs file: function _api_application_commandbars(CallingObject) { ThrowException('API application.commandbars not supported yet.'); } function _api_commandbars_item(CallingObject, index) { ThrowException('API commandbars.item not supported yet.'); }
Agar fungsi baru berfungsi, lakukan langkah-langkah berikut:
3.1 Tentukan jenis objek baru yang membuat fungsi CommandBars
dan koleksi CommandBars
baru yang mirip dengan yang ada di VBA.
3.2 Tambahkan metode getName()
untuk jenis objek baru.
Langkah 3.1 dan 3.2 ditampilkan dalam kode di bawah. Objek menu dibuat sebagai
jenis objek baru yang meniru perilaku CommandBars
.
// Our Implementation of CommandBar using Menu objects. function CommandBar(name) { this.name = name; // Create a menu object to represent the commandbar. this.menu = SpreadsheetApp.getUi().createMenu(name); // Create methods for retrieving or updating the name of the object this.getName = function() { return this.name; }; this.updateName = function(name) { this.name = name; }; // ======================================================================== // Implement other methods of CommandBar objects that are used in the script. // ===================================================================== return this; } // Our implementation of the collection of CommandBars that exists in VBA function CommandBars() { this.commandBars = []; this.getCommandBar = function(name) { for (var i = 0; i < this.commandBars.length; i++) { if (!this.commandBars[i].getName() == name) { return this.commandBars[i]; } } // No commandBar with the name exists, create a new one and return. var commandBar = new CommandBar(name); this.commandBars.push(commandBar); return commandBar; }; return this; } // Create a global object that represents CommandBars collection. var GlobalCommandBars = new CommandBars();
3.3 Ubah fungsi __handle_resolve_name
dalam file variant_resolution.gs
untuk menangani jenis objek baru. Tambahkan bagian ke fungsi, seperti yang ditunjukkan
di bawah:
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } // New section added below // ======================================================================== if (CallingObject instanceof CommandBar) { objectExtend(params_map, {VALUETOSET: params_map.param0}); if (ExecutionContext.isLhs) { // Call the setter method. CallingObject.updateName(params_map.VALUETOSET); found_api_variant = true; } else { // Getter is called, return the commandbar name, return_value = CallingObject.getName(); found_api_variant = true; } } // ======================================================================== // New section added above if (!found_api_variant) { ThrowException('API.name not supported yet.' ); } return return_value; }
3.4 Tentukan dua fungsi yang dibuat dalam file unimplemented_constructs.gs
(_api_application_commandbars()
, _api_commandbars_item()
). Langkah ini memastikan
panggilan asli fungsi berfungsi.
//This is straightforward based on the implementation of a CommandBar and the // CommandBars collection above: function _api_application_commandbars(CallingObject) { return GlobalCommandBars; } function _api_commandbars_item(CallingObject, index) { return CallingObject.getCommandBar(index); }
Konstruksi bahasa yang tidak diterapkan
Konstruksi adalah elemen bahasa kode yang mengontrol alur eksekusi atau tampilan data. Misalnya, loop, label, peristiwa, dan goto. Berikut adalah daftar semua konstruksi VBA.
Konstruksi yang tidak dapat dikonversi oleh Konverter Makro dianggap sebagai konstruksi bahasa yang tidak diterapkan.
Jika Konverter Makro menentukan bahwa konstruksi bahasa yang tidak diimplementasikan
ada, konverter akan menyisipkan komentar TODO
.
Konstruksi VBA berikut tidak didukung:
- AddressOf
- Mendeklarasikan
- DefType
- GoSub
- GoTo
- Mengimplementasikan
- Lset
- Buka
- RaiseEvent
- Nama
- Lanjutkan
- Rset
- TypeOf
- Class
- Modul Class
Memperbaiki error konstruksi bahasa yang tidak diterapkan
- Perbarui kode Anda agar logika Anda tidak bergantung pada konstruksi bahasa yang tidak didukung.
- Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
- Berdasarkan logika kode, perbarui dengan cara yang tidak memerlukan konstruksi bahasa yang tidak didukung.
- Jika tidak dapat menemukan cara untuk menulis ulang kode tanpa konstruksi bahasa yang tidak didukung, Anda tidak dapat mengonversi makro ini.
Contoh error konstruksi bahasa yang tidak diterapkan
Salah satu konstruksi bahasa yang paling umum dan belum diimplementasikan adalah pernyataan GoTo
.
Anda dapat mengganti beberapa pernyataan GoTo
VBA dengan loop. Berikut adalah dua contoh penggunaan loop, bukan pernyataan GoTo
.
Contoh 1: Ganti GoTo
dengan While Loop
Kode VBA asli
Sub Test() a = 0 start: Debug.Print a While a < 100 a = a + 1 If a Mod 3 == 0 Goto start End If Wend End Sub
function test() { var a = 0; start: do { console.log(a); while (a < 100) { a = a + 1; if (a % 3 == 0) { continue start; } } break start; } while (true); }
Contoh 2: Mengganti GoTo dengan Loop For
Kode VBA asliSub Test() a = 0 For i = 1 to 100 For j = 1 to 10 a =a a + 1 If i + j > 50 GoTo endLoop End If Next j Next i endLoop: MsgBox a End Sub
function test() { var a = 0; endLoop: for (var i = 1; i <= 100; i++) { for (var j = 0; j <=10; j++) { If (i + j > 50) { break endLoop; } } } Browser.msgBox(a); } break start; } while (true); }
API yang didukung sebagian
Untuk API yang didukung sebagian, beberapa parameter input didukung di Apps Script dan beberapa tidak.
Misalnya, legend_position
VBA API digunakan untuk menentukan legenda dalam
grafik Excel. Kode ini mendukung beberapa jenis nilai input, termasuk:
xlLegendPositionBottom
: Menempatkan legenda di bagian bawah diagram.xlLegendPositionCorner
: Menempatkan legenda di sudut diagram.xlLegendPositionCustom
: Menempatkan legenda di posisi kustom pada diagram.
Apps Script memiliki kode yang setara yang hanya mendukung beberapa nilai tersebut. Nilai berikut tidak didukung:
xlLegendPositionCorner
xlLegendPositionCustom
Untuk menandai nilai API yang tidak didukung sebagian dalam kode yang dikonversi,
kondisi validasi ditambahkan ke file library.gs
yang memeriksa nilai
tersebut. Contoh:
if (position == xlLegendPositionCorner || position == xlLegendPositionCustom) { position = _handle_legend_position_error(position); }
Jika kondisi validasi menemukan salah satu nilai yang tidak didukung, fungsi pengendali error, _handle_<API_name>_error
, akan dibuat dalam file unimplemented_constructs.gs
.
Fungsi ini menampilkan error pengguna dan tidak akan mengganti nilai dengan nilai yang didukung. Contoh:
/** * Throw error message for unsupported legend position. * The VBA API Legend.Position which can take values xlLegendPositionTop, * xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight, * xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in * Apps Scripts that supports only a subset of the values (does not support * xlLegendPositionCorner and xlLegendPositionCustom). * @param {string} position */ function _handle_legend_position_error(position) { // Please comment the throw statement and return a supported position value // instead. // Values that are supported here are xlLegendPositionTop, // xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight. throw new Error( 'Google Sheets does not support legend position: ' + position); }
Memperbaiki error API yang didukung sebagian
Tentukan fungsi _handle_<API_name>_error
untuk mengganti nilai yang tidak didukung
dengan solusi yang dapat diterima untuk kebutuhan Anda.
- Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
- Baca komentar di atas fungsi untuk memahami nilai mana yang didukung dan mana yang tidak.
- Untuk nilai yang tidak didukung, tentukan nilai yang didukung yang dapat berfungsi sebagai pengganti yang sesuai.
- Perbarui fungsi
_handle_<API_name>_error
untuk menampilkan nilai yang didukung. - Jika tidak dapat menemukan cara untuk mengganti nilai yang tidak didukung, Anda tidak dapat mengonversi makro ini.
Contoh error API yang didukung sebagian
Contoh berikut memperluas legend_position
VBA API yang disebutkan di atas.
Lihat API yang didukung sebagian.
Berikut adalah contoh kode VBA asli yang menggunakan nilai yang tidak didukung,
xlLegendPositionCustom
.
Charts(1).Legend.Position = xlLegendPositionCustom
Konverter Makro menambahkan fungsi di bawah ke file unimplemented_constructs.gs
:
/** * Throw error message for unsupported legend position. * The VBA API Legend.Position which can take values xlLegendPositionTop, * xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight, * xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in * Apps Scripts that supports only a subset of the values (does not support * xlLegendPositionCorner and xlLegendPositionCustom). * @param {string} position */ function _handle_legend_position_error(position) { // Please comment the throw statement and return a supported position value // instead. // Values that are supported here are xlLegendPositionTop, // xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight. throw new Error( 'Google Sheets does not support legend position: ' + position); }
Diperlukan pekerjaan manual
Perlu pekerjaan manual berarti VBA API dapat dikonversi menjadi Apps Script, tetapi memerlukan solusi.
Dalam laporan kompatibilitas yang Anda buat sebelum konversi, jenis API ini diberi label Didukung dengan solusi.
Jika Anda tidak memperbaiki jenis API ini dalam kode VBA sebelum mengonversi file, berikut tampilannya di project Apps Script:
/** * Could not convertAPI. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. *: * * You can use the following Apps Script APIs to convert it. * Apps Script APIs :* Apps Script documentation links : * * @param param1 { } * @param param2 {} * ... * @return {} */ function _api_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Memperbaiki error yang memerlukan pekerjaan manual
Terapkan solusi untuk API agar API berfungsi sebagaimana mestinya. 1. Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error. 1. Baca komentar di atas fungsi untuk memahami API mana yang dapat digunakan sebagai solusi. 1. Jika Anda tidak dapat menemukan solusi yang sesuai, pertimbangkan untuk menghapus API dari kode Anda. 1. Jika Anda tidak dapat menemukan solusi atau menghapus API ini dari kode dan makro Anda menampilkan error, Anda tidak dapat mengonversi makro ini.
Contoh error Pekerjaan manual diperlukan
Berikut adalah contoh API yang menampilkan error Pekerjaan manual diperlukan dan cara memperbaikinya:
Implement a workaround for Autocorrect.Addreplacement
.Implement a workaround for workbook.open()
. Contoh ini menunjukkan cara membuka file di Google Drive dengan Apps Script.
Contoh 1: Autocorrect.Addreplacement
Pada contoh berikut, Autocorrect.Addreplacement
VBA API dapat
dikonversi, tetapi memerlukan solusi. Konverter Makro menyarankan cara
menerapkan fungsi dalam komentar kode.
/** * Could not convert autocorrect.addreplacement API. Please add relevant code in * the following function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * You can use the following Apps Script APIs to convert it. * Apps Script APIs : FindReplaceRequest , onEdit * Apps Script documentation links : * https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest * Comments : AutoCorrect.AddReplacement was not converted, but there is an * equivalent option you can implement manually. Use onEdit and FindReplaceRequest * APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * and https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest. * For more information on API manual implementation, see * https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors. * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} What * @param {string} Replacement * @return {string} */ function _api_autocorrect_addreplacement(CallingObject, What, Replacement) { ThrowException('API autocorrect.addreplacement not supported yet.'); }
Implementasi Autocorrect.Addreplacement
API ditunjukkan di bawah ini:
var AUTO_CORRECTIONS = "AUTO_CORRECTIONS"; // Need to get the autocorrections set in previous sessions and use them. var savedAutoCorrections = PropertiesService.getDocumentProperties().getProperty(AUTO_CORRECTIONS); var autoCorrections = savedAutoCorrections ? JSON.parse(savedAutoCorrections) : {}; function onEdit(e) { autoCorrect(e.range); } function autoCorrect(range) { for (key in autoCorrections) { // Replace each word that needs to be auto-corrected with their replacements. range.createTextFinder(key) .matchCase(true) .matchEntireCell(false) .matchFormulaText(false) .useRegularExpression(false) .replaceAllWith(autoCorrections[key]); } } /** * Could not convert autocorrect.addreplacement API. Please add relevant code in * the following function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * * You can use the following Apps Script APIs to convert it. * Apps Script APIs : createTextFinder , onEdit * Apps Script documentation links : https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit , createTextFinder * Comments : AutoCorrect.AddReplacement was not converted, but there is an * equivalent option you can implement manually. Use onEdit and FindReplaceRequest * APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * and createTextFinder. For more information on API manual implementation, see * https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors. * * @param {Object} CallingObject represents the parent object using which the API has been called. * @param {string} What * @param {string} Replacement * * @return {string} */ function _api_autocorrect_addreplacement(CallingObject, What, Replacement) { autoCorrections[What] = Replacement; // Store the updated autoCorrections in the properties so that future executions use the correction. PropertiesService.getDocumentProperties().setProperty(AUTO_CORRECTIONS, JSON.stringify(autoCorrections)); }
Contoh 2: Workbook.open()
workbook.open()
VBA API membuka file lokal berdasarkan jalur file.
Misalkan ada dua file yang dibuka oleh workbook.open()
dalam kode VBA:
- File 1:
C:\Data\abc.xlsx
- File 2:
C:\Data\xyz.xlsx
Gambar di bawah menunjukkan cara Konverter Makro mengganti Workbook.open()
dengan Skrip
Aplikasi di mana pun Workbook.open()
digunakan untuk membuka File 1:
var spreadSheetId = _handle_mso_excel_get_google_spreadsheet_id("C:\Data\abc.xlsx"); var spreadSheet = SpreadsheetApp.openById(spreadSheetId);
unimplemented_constructs.gs
dalam
project Apps Script:
/** * Method to return the spreadsheet id manually. * * @param {string} FileName ID of the spreadsheet to be opened. * @return {string} return the spreadsheet id. */ function _handle_mso_excel_get_google_spreadsheet_id(FileName) { // Upload the Excel files being opened by the API to Google Drive and convert // them to Google Sheets. // Determine the spreadsheet ID of the Google Sheets file created. // Implement this method to return the corresponding spreadsheet ID when given //the original file path as parameter. throw new Error('Please return the spreadsheet ID corresponding to filename: ' + FileName); return '' ; }
Seperti yang diinstruksikan oleh komentar dalam contoh di atas, Anda perlu mengonversi file target ke file Google Spreadsheet di Google Drive.
ID Google Spreadsheet yang sesuai dicetak tebal di bawah ini:
- File #1:
C:\Data\abc.xlsx
menjadihttps://docs.google.com/spreadsheets/d/abc123Abc123Abc123abc
- File #2:
C:\Data\abc.xlsx
menjadihttps://docs.google.com/spreadsheets/d/xyz456Xyz456xYz456xyZ
Kemudian, ubah kode dalam fungsi Apps Script untuk membuka file berdasarkan ID, seperti yang ditunjukkan di bawah:
/** * Method to return the spreadsheet id manually. * * @param {string} FileName ID of the spreadsheet to be opened. * @return {string} return the spreadsheet id. */ function _handle_mso_excel_get_google_spreadsheet_id(FileName) { // Upload the Excel files being opened by the API to Google Drive and convert //them to Google Sheets. // Determine the spreadsheet ID of the Google Sheets file created. // Implement this method to return the corresponding spreadsheet ID when given //the original file path as parameter if (Filename.indexOf("abc.xlsx") >= 0) { return "abc123Abc123Abc123abc"; } else if (Filename.indexOf("xyz.xlsx") >= 0) { return "xyz456Xyz456xYz456xyZ"; }
Error yang disengaja
Error yang disengaja ditambahkan ke kode yang dikonversi untuk meniru perilaku error kode VBA asli Anda. Anda tidak perlu mengubah error ini.
Contoh error yang disengaja
Jika Anda mencoba mengakses elemen di luar batas array di VBA, kode akan menampilkan pengecualian. Di Apps Script, kode akan menampilkan undefined.
Untuk menghindari hasil yang tidak terduga, Konverter Makro menambahkan kode Apps Script yang menampilkan pengecualian jika Anda mencoba mengakses elemen di luar batas array.
Contoh ini ditampilkan dalam kode di bawah:
Kode VBA asliDim arr arr = Array("apple", "orange") MsgBox arr(5) Will throw the following error: Subscript out of range
var arr; arr = ["apple", "orange"]; Browser.msgBox(arr[5]); Will return this value and not throw an error: undefined
/** * Extend the regular JS array to support VB style indexing with a get method. * @returns{*} value at the index */ Array.prototype.get = function() { var curr_res = this; for (var i = 0; i < arguments.length; i++) { if (!Array.isArray(curr_res) || curr_res.length < arguments[i]) { throw new Error(‘Converted VBA Error (Intentional Error): Subscript out of range’); } curr_res = curr_res[arguments[i]]; } return curr_res; }; var arr; arr = ["apple", "orange"]; Browser.msgBox(arr.get(5));
Artikel terkait
- Ringkasan add-on Konverter Makro
- Menentukan apakah makro VBA kompatibel
- Mengonversi makro VBA ke Apps Script
- Mengatasi masalah umum
- Tonton tutorial Konverter Makro
- Daftar API VBA yang kompatibel