Memperbaiki error dalam kode yang dikonversi

Add-on Macro Converter 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 VBA dan nilai yang tidak ada di Apps Script.
  • Menerapkan 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 di 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 yang baru agar lebih mirip dengan 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 Pengonversi Makro. Anda mungkin perlu memodifikasi file ini untuk membuat kode berfungsi sebagaimana mestinya.

Contoh: Window.Activate()

Berikut adalah contoh API yang tidak didukung bernama Window.Activate(). Pengonversi 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 ini akan ditambahkan ke kode Apps Script yang dikonversi di mana pun 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 diterapkan di mana pun fungsi tersebut muncul di 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 akan ditambahkan ke project Apps Script 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.

Macro Converter 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 mengupdate fungsi __handle_resolve_<api>() untuk mendeklarasikan jenis objek secara manual. Lihat Jenis objek yang tidak didukung.

Contoh: name()

Banyak jenis objek di VBA yang menentukan name() API. Biasanya, Apps Script yang setara adalah getName(), tetapi tidak untuk setiap jenis objek. Beberapa kasus alternatif dapat terjadi:

  • API setara objek disebut sesuatu yang berbeda dari getName().
  • Objek ini tidak memiliki Apps Script API untuk mendapatkan namanya.
  • Tidak ada objek Apps Script yang setara.

Jika jenis objek tidak ditentukan, Pengonversi Makro akan membuat fungsi baru yang disebut __handle_resolve_name di 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. Pemilihan dapat berupa objek Sheet atau objek Shape. Jika ini objek Sheet, terjemahannya adalah getName(), tetapi jika itu objek Shape, tidak ada padanan 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 menangani 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 menggunakan runtime V8 default, Anda akan melihat error seperti berikut:

_api_windows_active (unimplemented_constructs:2:3)

Ini berarti error terletak di file unimplemented_constructs.gs di 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 ini terletak di file unimplemented_constructs.gs di baris 2.

Jenis Error

Anda dapat memperbaiki sebagian besar error yang dialami dalam file unimplemented_constructs.gs dan variant_resolution.gs yang dijelaskan di atas.

Jenis kesalahan yang mungkin Anda temui meliputi:

API tidak diterapkan

API yang tidak diterapkan adalah API yang tidak dapat dikonversi oleh Pengonversi 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 diterapkan mungkin akan ditambahkan ke file variant_resolution.gs.

Dalam laporan kompatibilitas yang Anda buat sebelum konversi, API ini diberi label sebagai Perlu investigasi lebih lanjut.

Jika Anda tidak memperbaiki jenis API ini di kode VBA sebelum mengonversi file, berikut adalah 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_(param1, param2, ....) {
  ThrowException("API  not supported yet.");
}

Memperbaiki error API yang tidak diterapkan

Tentukan API yang tidak diterapkan dengan library Apps Script API atau JS yang ada. Untuk melakukannya, ikuti langkah-langkah ini:

  1. Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
  2. Di atas fungsi, baca komentar yang telah ditambahkan. Dalam beberapa kasus, komentar tersebut menyarankan cara menerapkan API di Apps Script.
  3. Jika Anda tidak dapat menemukan cara untuk menerapkan API di Apps Script, sebaiknya hapus API tersebut dari kode Anda.
  4. Jika 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:

Contoh 1: Tidak ada Apps Script yang setara atau API 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.');
}
Meskipun tidak dapat melindungi diagram, Anda dapat melindungi rentang data diagram sehingga data tidak dapat diubah.

Contoh penerapan melindungi rentang ditampilkan di bawah:
/**
* 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 yang tidak didukung

Jika jenis objek tidak diketahui, error API yang tidak diterapkan akan ditambahkan ke file variant_resolution.gs. Contoh berikut memperluas contoh API name() VBA di atas. Lihat variant_resolution.gs.

Dalam contoh ini, Anda akan mempelajari:

  1. Cara name() API dikonversi ke fungsi baru dalam file variant_resolution.gs.
  2. Cara fungsi baru dipanggil dalam kode yang dikonversi.
  3. 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 untuk memanggil name(), Pengonversi Makro akan membuat fungsi baru yang disebut __handle_resolve_name, yang ditampilkan di bawah ini.

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. Misalnya kode VBA menentukan fungsi PrintName() yang memanggil name() API. 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
Karena `name()` dipanggil pada objek yang merupakan variabel, kode yang dikonversi tidak mengetahui jenis objek pada saat konversi. Kode Apps Script yang dikonversi akan memanggil fungsi `__handle_resolve_name`:
function PrintName(obj) {
  Logger.log(_handle_resolve_name(obj));
}

3. Misalkan 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. Oleh karena itu, dua metode yang digunakan dalam kode VBA di atas juga tidak didukung.
  • Application.CommandBars(): Di VBA, fungsi ini akan menampilkan daftar semua objek CommandBar.
  • CommandBars.item(): Di VBA, ini menampilkan objek CommandBar tertentu.
Karena jenis objek ini tidak didukung di Apps Script, kode yang dikonversi akan membuat fungsi berikut dalam file `unimplementation_konstruk.gs` yang perlu Anda tentukan.
  • _api_application_commandbars()
  • _api_commandbars_item()
Fungsi dipanggil dalam kode yang dikonversi seperti yang ditunjukkan di bawah ini:
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 ini berfungsi, lakukan langkah-langkah berikut:

3.1 Menentukan jenis objek baru yang membuat fungsionalitas 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 pada kode di bawah ini. 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 ini:

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 Menentukan dua fungsi yang dibuat dalam file unimplemented_constructs.gs (_api_application_commandbars(), _api_commandbars_item()). Langkah ini memastikan panggilan asli dari fungsi tersebut 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

construct 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 Pengonversi Makro dianggap sebagai konstruksi bahasa yang tidak diterapkan.

Saat Pengonversi Makro menentukan bahwa ada konstruksi bahasa yang tidak diterapkan, pengonversi Makro akan menyisipkan komentar TODO.

Konstruksi VBA berikut tidak didukung:

Memperbaiki error pembuatan bahasa yang tidak diterapkan

  1. Update kode Anda sehingga logika Anda tidak bergantung pada konstruksi bahasa yang tidak didukung.
  2. Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
  3. Berdasarkan logika kode, perbarui kode dengan cara yang tidak memerlukan konstruksi bahasa yang tidak didukung.
  4. Jika tidak dapat menemukan cara untuk menulis ulang kode tanpa konstruksi bahasa yang tidak didukung, Anda tidak dapat mengonversi makro ini.

Contoh error pembuatan bahasa yang tidak diterapkan

Salah satu konstruksi bahasa paling umum yang tidak 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
Kode Apps Script yang setara
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 For Loop

Kode VBA asli
Sub 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
Kode Apps Script yang setara
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, tetapi beberapa tidak.

Misalnya, VBA API legend_position digunakan untuk menentukan legenda dalam grafik Excel. Fungsi ini mendukung berbagai 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 setara yang hanya mendukung sebagian nilai tersebut. Nilai berikut tidak didukung:

  • xlLegendPositionCorner
  • xlLegendPositionCustom

Untuk menandai nilai yang tidak didukung dari API yang didukung sebagian dalam kode Anda 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 di 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 sesuai kebutuhan Anda.

  1. Buka kode Apps Script yang dikonversi di lokasi error. Lihat Menemukan error.
  2. Baca komentar di atas fungsi untuk memahami nilai mana yang didukung dan yang tidak.
  3. Untuk nilai yang tidak didukung, tentukan nilai yang didukung yang dapat berfungsi sebagai pengganti yang sesuai.
  4. Update fungsi _handle_<API_name>_error untuk menampilkan nilai yang didukung.
  5. 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

Pengonversi Makro akan menambahkan fungsi di bawah ini 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);
}

Pekerjaan manual diperlukan

Pekerjaan manual yang diperlukan berarti bahwa VBA API dapat dikonversi menjadi Apps Script, tetapi memerlukan solusi.

Dalam laporan kompatibilitas yang Anda buat sebelum konversi, jenis API ini diberi label sebagai Didukung dengan solusi.

Jika Anda tidak memperbaiki jenis API ini di kode VBA sebelum mengonversi file, berikut adalah tampilannya di project Apps Script:

/**
* Could not convert  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.
*      : 
*
* 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_(param1, param2, ....) {
 ThrowException("API  not supported yet.");
}

Perbaiki error yang diperlukan terkait pekerjaan manual

Menerapkan solusi 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 tidak dapat menemukan solusi yang sesuai, pertimbangkan untuk menghapus API dari kode Anda. 1. Jika tidak dapat menemukan solusi atau menghapus API ini dari kode dan makro Anda menampilkan error, Anda tidak dapat mengonversi makro ini.

Contoh error yang dibutuhkan terkait Pekerjaan manual

Berikut adalah contoh API yang menampilkan error yang diperlukan Pekerjaan manual dan cara memperbaikinya:

Contoh 1: Autocorrect.Addreplacement

Pada contoh berikut, Autocorrect.Addreplacement VBA API dapat dikonversi, tetapi memerlukan solusi. Pengonversi 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 ditampilkan 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()

VBA API workbook.open() akan 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 ini menunjukkan cara Pengonversi Makro mengganti Workbook.open() dengan Apps Script 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);
Error di bawah ditambahkan ke file 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 harus mengonversi file target menjadi file Google Spreadsheet di Google Drive.

ID Google Spreadsheet yang sesuai tercetak tebal di bawah ini:

  • File #1: C:\Data\abc.xlsx menjadi https://docs.google.com/spreadsheets/d/abc123Abc123Abc123abc
  • File #2: C:\Data\abc.xlsx menjadi https://docs.google.com/spreadsheets/d/xyz456Xyz456xYz456xyZ

Kemudian, ubah kode dalam fungsi Apps Script untuk membuka file menurut 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 nilai yang tidak ditentukan.

Untuk menghindari hasil yang tidak diharapkan, Pengonversi Makro menambahkan kode Apps Script yang menampilkan pengecualian jika Anda mencoba mengakses elemen di luar batas array.

Contoh ini ditunjukkan dalam kode di bawah ini:

Kode VBA asli
Dim arr
arr = Array("apple", "orange")
MsgBox arr(5)
Will throw the following error:
Subscript out of range
Kode Apps Script yang dikonversi (sebelum error pengecualian ditambahkan)
var arr;
arr = ["apple", "orange"];
Browser.msgBox(arr[5]);
Will return this value and not throw an error:
undefined
Kode Apps Script ditambahkan untuk menampilkan error pengecualian
/**
* 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));